2012-07-06 6 views
90

मेरे पास एक ऐसा दृश्य है जिसमें इसकी फ्रेम प्रोग्रामेटिक रूप से छेड़छाड़ की आवश्यकता है - यह एक प्रकार का दस्तावेज़ दृश्य है जो इसकी सामग्री को लपेटता है जिसे फिर स्क्रॉल किया जाता है और फ्रेम उत्पत्ति को जोड़कर पर्यवेक्षण के चारों ओर ज़ूम किया जाता है। Autolayout रनटाइम पर इसके साथ झगड़ा।क्या मैं रनटाइम पर एक विशिष्ट सबव्यू के लिए ऑटोलायआउट अक्षम कर सकता हूं?

ऑटोलायआउट को अक्षम करना पूरी तरह से कठोर लगता है क्योंकि यह अन्य विचारों के लिए लेआउट को संभालने के लिए उचित रूप से उपयोग किया जा सकता है। ऐसा लगता है कि मैं क्या चाहता हूं कि कुछ प्रकार की "शून्य बाधा" है।

उत्तर

1
  • 4,5
  • चयन में खोलें परियोजना स्टोरीबोर्ड
  • ओपन फाइल निरीक्षक
  • तहत इंटरफ़ेस बिल्डर दस्तावेज़ अचिह्नित 'का प्रयोग करें autolayout'

आप एक से अधिक स्टोरीबोर्ड भर में विभाजित कर सकते हैं यदि आप चाहते हैं कुछ विचारों के लिए autolayout का उपयोग करें।

+10

जो पूरे स्टोरीबोर्ड/निब के लिए ऑटोलायआउट अक्षम करता है। जो मैं खोज रहा था वह एक स्टोरीबोर्ड/निब के भीतर विशेष सबव्यूज़ रखने के लिए एक आदर्श तरीका है (आदर्श प्रोग्रामेटिक) जो स्टोरीबोर्ड/निब निर्दिष्ट किए गए बाकी को छोड़कर ऑटोलायआउट का उपयोग नहीं करता है। \t // प्रदर्शन के लिए storboard और विवरण दृश्य नियंत्रक प्रारंभ UIStoryboard * sb = [UIStoryboard storyboardWithName:: @ "स्टोरीबोर्ड" बंडल: [NSBundle mainBundle – terriblememory

+0

आप की जरूरत के रूप में कई स्टोरीबोर्ड इस्तेमाल कर सकते हैं और बस के साथ लोगों को आह्वान/autolayout बिना ]]; DetailViewController * dvController = [sb instantiateViewControllerWithIdentifier: entry.viewName]; –

22

शायद translatesAutoresizingMaskIntoConstraints से YES (और उस दृश्य को प्रभावित करने वाली अतिरिक्त बाधाओं को जोड़ने) को सेट करने से आप ऑटो लेआउट सिस्टम से लड़ने के बिना फ्रेम सेट कर सकते हैं।

49

मेरे पास एक समान समस्या थी जहां ऑटोलायआउट रन टाइम पर मेरी कुछ फ्रेम सेटिंग को ओवरराइड कर रहा था (मेरे पास एक गतिशील दृश्य था कि कुछ मामलों में एक नया दृश्य नियंत्रक धक्का दिया ... धक्का देना और फिर वापस दबाकर प्रारंभिक दृश्य को रीसेट करना होगा)।

मुझे अपने मैनिपुलेशन कोड को मेरे व्यू कंट्रोलर के viewDidLayoutSubviews में डालकर मिल गया। ऐसा लगता है कि जो भी बाधा मोोजो कहा जाता है, लेकिन डीडएपियर को देखने से पहले, तो उपयोगकर्ता कोई भी बुद्धिमान नहीं है।

+1

self.navigationItem.titleView के लिए काम नहीं करता है। अभी भी फ्रेम परिवर्तन का सम्मान नहीं करता है। –

+1

यदि आप किसी शीर्षक दृश्य के फ्रेम के साथ मक करने की कोशिश कर रहे हैं, तो मैं इसे एक कंटेनर व्यू के अंदर रखूंगा और नेविगेशन इटैम के कस्टम व्यू के रूप में कंटेनर व्यू जोड़ूंगा। – jmstone617

+2

यह मेरे लिए भी काम करता है। मैं इस कामकाज की खोज से पहले 2h: 22m बर्बाद दीवार के खिलाफ अपने सिर टक्कर लगी होगी। – TMc

-14

अगर यह xib फ़ाइल है:

  1. .xib फ़ाइल
  2. चुनें "फ़ाइल के मालिक"
  3. उपयोगिताएँ पर
  4. क्लिक दिखाने का चयन करें: "इंस्पेक्टर फ़ाइल"
  5. के तहत " इंटरफेस बिल्डर दस्तावेज़ "अक्षम:" Autolayout का उपयोग करें "
+1

नहीं, जो पूरे xib के लिए autolayout अक्षम करता है। जो मैं खोज रहा था वह ऑटोलायआउट सिस्टम से केवल एक विशेष सबव्यूव लेने का एक तरीका है। – terriblememory

+0

वह केवल एक दृश्य के लिए ऑटोलायआउट अक्षम करना चाहता है .. – BilalReffas

157

मुझे एक ही समस्या थी। लेकिन मैंने इसे हल कर लिया है।
हां, आप एक विशिष्ट UIView के लिए रनटाइम पर स्वत: लेआउट को अक्षम कर सकते हैं, इसे पूरे xib या स्टोरीबोर्ड के लिए अक्षम करने के बजाय जो एक्सकोड 4.3 और बाद में डिफ़ॉल्ट रूप से सेट किया गया है।

सेट translatesAutoresizingMaskIntoConstraintsYES, इससे पहले कि आप अपने subview के फ्रेम सेट: मेरे लिए

self.exampleView.translatesAutoresizingMaskIntoConstraints = YES; 
self.exampleView.frame = CGRectMake(20, 20, 50, 50); 
+2

यह कुछ और जटिल मामलों के लिए बहुत अधिक विचारों के साथ ओवरकिल जैसा दिखता है। इस तरह के लिए कुछ आसान के लिए, यह ठीक है। – esh

+0

शब्बी, लेकिन मेरे लिए काम करता है। –

+0

@ मुहम्मद अहमरीली सबव्यूव को हटा दें और फिर इसे वापस जोड़ें प्रदर्शन कम हो सकता है। क्या हम बेहतर समाधान संग्रह कर सकते हैं? –

1

को प्रोग्राम subview बनाने के लिए, मेरे मामले में ऑटो लेआउट एक दृश्य है कि मैं करने के लिए आवश्यक के साथ खिलवाड़ किया गया था काम अपने केंद्र के चारों ओर घूमते हैं लेकिन एक बार जब मैंने इस दृश्य को प्रोग्रामेटिक रूप से बनाया तो यह काम करता था।

0

यह स्टोरीबोर्ड या xib फ़ाइलों के बिना एक परियोजना में मेरे साथ हुआ। सभी 100% कोड। मेरे पास नीचे एक विज्ञापन बैनर था और चाहता था कि विज्ञापन बैनर पर दृश्य सीमाएं रुक जाए। दृश्य लोड होने के बाद स्वचालित रूप से आकार बदल जाएगा। मैंने इस पृष्ठ पर हर संकल्प की कोशिश की लेकिन उनमें से कोई भी काम नहीं किया।

मैं केवल छोटी ऊंचाई के साथ एक उप दृश्य बना रहा और इसे नियंत्रक के मुख्य दृश्य में रखा। तब मेरी सारी सामग्री उप दृश्य के अंदर गई। इसने कुछ भी ऐसा किए बिना समस्या को हल किया जो महसूस किया कि यह अनाज के खिलाफ जा रहा था।

मैं सोच रहा हूं कि क्या आप एक ऐसा दृश्य चाहते हैं जो खिड़की भरने वाले सामान्य आकार का नहीं है तो आपको इसके लिए एक उप दृश्य का उपयोग करना चाहिए।

6

आप translatesAutoresizingMaskIntoConstraints टाइप Boolean टाइप कर सकते हैं, UIView के उपयोगकर्ता परिभाषित रनटाइम विशेषताओं में वैल्यू हां, जिसे आप xib/storyboard में चाहते हैं।

0

मुझे एक समान परिदृश्य का सामना करना पड़ा है, जहां मैं ऑटो-लेआउट के साथ शुरू की गई एक परियोजना में शामिल हो गया, लेकिन मुझे कई विचारों में गतिशील समायोजन करने की आवश्यकता थी। यहां मेरे लिए क्या काम किया गया है:

  1. इंटरफ़ेस बिल्डर में विचार या घटक नहीं रखे गए हैं।

  2. अपने विचारों को पूरी तरह से प्रोग्रामेटिक रूप से alloc/init से शुरू करना और उनके फ्रेम को उचित रूप से सेट करना जोड़ें।

  3. हो गया।

8

मैं अगर यह किसी और में मदद मिलेगी पता नहीं है, लेकिन मुझे लगता है क्योंकि मैं अपने आप को यह एक बहुत कुछ कर पाते हैं यह सुविधाजनक बनाने के लिए एक वर्ग लिखा था।

UIView + DisableAutolayoutTemporarily.h

#import <UIKit/UIKit.h> 

@interface UIView (DisableAutolayoutTemporarily) 

// the view as a parameter is a convenience so we don't have to always 
// guard against strong-reference cycles 
- (void)resizeWithBlock:(void (^)(UIView *view))block; 

@end 

UIView + DisableAutolayoutTemporarily.m

#import "UIView+DisableAutoResizeTemporarily.h" 
@implementation UIView (DisableAutoResizeTemporarily) 

- (void)resizeWithBlock:(void (^)(UIView * view))block 
{ 
    UIView *superview = self.superview; 
    [self removeFromSuperview]; 
    [self setTranslatesAutoresizingMaskIntoConstraints:YES]; 
    __weak UIView *weakSelf = self; 
    block(weakSelf); 
    [superview addSubview:self]; 
} 

@end 

मैं इसे इस तरह का उपयोग करें:

[cell.argumentLabel resizeWithBlock:^(UIView *view) { 
    [view setFrame:frame]; 
}]; 

आशा है कि यह मदद करता है।

+0

शानदार गुणों का आविष्कार करता है! मैंने किसी भी UIView के लिए एक सरल "hideControl" फ़ंक्शन लिखने के लिए आपके कोड का एक संशोधित संस्करण उपयोग किया था। यह मूल रूप से UIView की ऊंचाई 0 पर सेट करता है, लेकिन, महत्वपूर्ण रूप से, यह ऑटोलाउट को ठीक से संभालने के लिए आपके कोड का उपयोग करता है ("someView.hidden = TRUE" का उपयोग करने के विपरीत)। तो छिपे हुए नियंत्रण के नीचे दिखाई देने वाले नियंत्रण, और इसके साथ जुड़े लंबवत अंतर थे, अब अंतराल को भरने के लिए स्क्रीन पर स्थानांतरित हो जाएंगे, जहां छुपा-दृश्य पहले दिखाई दिया था। –

+0

आपने अभी अपना जीवन बचाया है! ढेर सारा धन्यवाद ! – Zaphod

15

आईओएस 8 में आप एनएसएलएआउट कॉन्स्ट्रेन को सक्रिय या नहीं सेट कर सकते हैं। तो अगर मैं इंटरफ़ेस बिल्डर का उपयोग कर रहा है, मैं एक OutletCollection करने के लिए अपने सभी बाधाओं जोड़ने और फिर सक्रिय या निष्क्रिय का उपयोग कर:

NSLayoutConstraint.deactivateConstraints(self.landscapeConstraintsPad) 
NSLayoutConstraint.activateConstraints(self.portraitConstraintsPad) 

विशेष आवेदन मैं यहाँ के लिए यह उपयोग कर रहा हूँ और आड़े मोड में विभिन्न बाधाओं हो रही है और मैं डिवाइस के घूर्णन के आधार पर सक्रिय/निष्क्रिय करता हूं। इसका मतलब है कि मैं दोनों ओरिएंटेशन बिल्डर में दोनों जटिलताओं के लिए कुछ जटिल लेआउट परिवर्तन कर सकता हूं, और फिर भी वर्बोज़ ऑटो लेआउट कोड के बिना ऑटो लेआउट का उपयोग कर सकता हूं।

या आप हटाएं कॉन्स्ट्रेनेंट्स और एडकंट्रेन का उपयोग करके सक्रिय/निष्क्रिय कर सकते हैं।

+0

ऐसे पुराने प्रश्न को अपहरण करने के लिए खेद है, लेकिन क्या मैं पूछ सकता हूं कि आप पहली जगह में विभिन्न लेआउट के लिए लेआउट बाधाओं को कैसे प्रबंधित करते हैं? मुझे बाधाओं को सक्षम/अक्षम करने के लिए इंटरफ़ेस निर्माता के अंदर कोई विकल्प नहीं दिख रहा है। या आपने बस दोनों लेआउट के लिए बाधाएं जोड़ दी हैं और केवल अमान्य (ओवरराइडिंग) बाधाओं के बारे में शिकायत करने वाले इंटरफ़ेस बिल्डर को अनदेखा कर दिया है? – Malte

+0

ठीक है आप आकार वर्गों का उपयोग करके इसे कर सकते हैं: https://developer.apple.com/library/ios/recipes/xcode_help-IB_adaptive_sizes/chapters/SelectingASizeClass.html#//apple_ref/doc/uid/TP40014436-CH7-SW1 , लेकिन मैं इसे इस तरह से नहीं कर सका क्योंकि मैं आईओएस 7 का भी समर्थन कर रहा था और आकार कक्षाएं पूरी तरह से आईओएस 7 का समर्थन नहीं करतीं। मैंने इसे विवादित बाधा की प्राथमिकता को कम करके किया। आदर्श नहीं है, लेकिन यह चेतावनी को रोकता है।मुझे लगता है कि मैंने वैसे भी इसे कैसे किया .... – bandejapaisa

0

ऑटोलायआउट को अक्षम करने के बजाय, मैं केवल उस फ्रेम के साथ नई बाधा की गणना करूंगा जो आप बदल रहे हैं। यह मेरे लिए उपयुक्त तरीका प्रतीत होता है। यदि आप उन घटकों को समायोजित कर रहे हैं जो बाधाओं पर भरोसा करते हैं, तो तदनुसार उन्हें समायोजित करें।

उदाहरण के लिए, यदि आपके पास दो विचारों (myView और अन्य दृश्य) के बीच 0 की लंबवत बाधा है, और आपके पास एक पैन इशारा या कुछ है जो myView की ऊंचाई समायोजित करता है तो आप समायोजित मानों के साथ बाधा को फिर से समझ सकते हैं।

self.verticalConstraint.constant = newMyViewYOriginValue - (self.otherView.frame.origin.y + self.otherView.frame.size.height); 
[self.myView needsUpdateConstraints]; 
0

जो ऑटो लेआउट का उपयोग कर रहे आप में से उन लोगों के लिए, मेरे समाधान here देखें। आपको @IBOutlet की बाधाओं को समायोजित करना चाहते हैं जिन्हें आप समायोजित करना चाहते हैं और फिर उनके स्थिरांक को बदलना चाहिए।

-1

मेरे विचार में मेरे पास एक लेबल और एक टेक्स्ट था। लेबल में पैन इशारा था। ड्रैग के दौरान लेबल ठीक चारों ओर चलता है। लेकिन जब मैं टेक्स्ट बॉक्स कीबोर्ड का उपयोग करता हूं, तो लेबल ऑटो लेआउट में परिभाषित मूल स्थान पर अपनी स्थिति रीसेट करता है। जब मैंने लेबल के लिए स्विफ्ट में निम्नलिखित जोड़ा तो समस्या हल हो गई। मैंने इसे व्यूपियर में जोड़ा लेकिन इसे कहीं भी कहीं भी जोड़ा जा सकता है जहां आपके पास लक्षित क्षेत्र तक पहुंच है।

self.captionUILabel.translatesAutoresizingMaskIntoConstraints = true 
संबंधित मुद्दे

 संबंधित मुद्दे