2015-11-08 6 views
6

मैं storyboard और autolayout का उपयोग कर रहा हूं, और इसी दृश्य नियंत्रक में IBOutlet के रूप में आईबी में बाधाओं को सेट कर रहा हूं। मैं बाधाओं अपडेट करने का तरीका चित्र में और परिदृश्य में अलग होने की के बारे में कई पदों पढ़ रहा हूँ लेकिन मैं अभी भी मैं यह कैसे करना चाहिए के बारे में सुनिश्चित नहीं कर रहा हूँ:डिवाइस अभिविन्यास बदलते समय प्रोग्रामेटिक रूप से बाधाओं को अद्यतन करने का सही तरीका?

  1. मैं -viewWillTransitionToSize:withTransitionCoordinator: विधि में नए बाधाओं सेट करनी चाहिए, या updateViewConstraints विधि में?
  2. जब नए बाधाओं सेट कर रहे हैं, मैं [self.view setNeedsUpdateConstraints]; बुलाना चाहिए, या layoutIfNeeded, या setNeedsLayout?
  3. मैं कैसे करना चाहिए, उदाहरण के लिए, एक निश्चित बाधा के लगातार:

    self.myConstraint.constant = 30.0

या कर रही:

[self.view removeConstraint:self.passwordViewHeight]; 

self.passwordViewHeight = [NSLayoutConstraint constraintWithItem:self.passwordView 
                 attribute:NSLayoutAttributeHeight 
                 relatedBy:NSLayoutRelationEqual 
                 toItem:nil 
                 attribute:NSLayoutAttributeNotAnAttribute 
                multiplier:1.0 
                 constant:34.0]; 

[self.view addConstraint:self.passwordViewHeight]; 

धन्यवाद अग्रिम में

उत्तर

0
सबसे अच्छा

रास्ता बाधा और पुनरुत्थान को हटाने के बजाय निरंतर बदलना होगा फिर से यह। निरंतर से जोड़ना या घटाना भी लंबे समय तक बहुत तेज है।

[self.view layoutIfNeeded]; 
self.myConstraint.constant = 30.0; 
[self.view layoutIfNeeded]; 

यह अनुशंसित है कि आप से पहले layoutIfNeeded कॉल और के बाद आप के साथ-साथ लगातार बदल: क्या आप क्या करना चाहते हैं की तरह कुछ है। ऐसा इसलिए है क्योंकि आपको कुछ बाधाएं हो सकती हैं जो अभी तक नहीं की गई हैं और इससे पहले कि आप अधिक बाधाओं को बदल सकें, ऐसा करेंगे।

+0

धन्यवाद। मुझे किस विधि से कॉल करना चाहिए? – AppsDev

+0

यदि आप डिवाइस अभिविन्यास परिवर्तन के लिए अधिसूचना सेट अप करते हैं, तो आप इसे उस कॉल से कॉल करने के लिए अपनी स्वयं की विधि बना सकते हैं। आपको लगता है कि सेट नहीं किया है, आप निश्चित रूप से निम्न कोड के साथ ऐसा करना चाहते हैं जाएगा: '[[NSNotificationCenter defaultCenter] addObserver: स्वयं चयनकर्ता: @selector (yourMethodHere) नाम: UIDeviceOrientationDidChangeNotification वस्तु: शून्य];' – Tyler

+0

होगा ' viewWillTransitionToSize' विधि भी एक अच्छी जगह है? – AppsDev

0

सबसे अच्छा विचार autorotation परिवर्तन को प्राप्त करने के इंटरफ़ेस बिल्डर में Size Classes का उपयोग किया जाएगा।

https://www.codefellows.org/blog/size-classes-with-xcode-6-one-storyboard-for-all-sizes

+0

धन्यवाद। मुझे आईफोन उपकरणों के लिए आईओएस 7 और ऊपर का समर्थन करने की ज़रूरत है और मेरे पास पहले से ही 'ऑटोलायआउट' सक्षम के साथ 'स्टोरीबोर्ड' है। मेरे पास इस स्टोरीबोर्ड में लगभग 32 दृश्य हैं ... क्या इस बिंदु पर आकार कक्षाओं में स्थानांतरित करना और यह ध्यान में रखना है कि मुझे आईओएस 7 का समर्थन करना है? – AppsDev

1

अभिविन्यास परिवर्तन विधि viewWillTransitionToSize का उपयोग कर पता लगाया जा। जब डिवाइस अभिविन्यास बदलने वाला है तो यह विधि कॉल की जाएगी।

-(void)viewWillTransitionToSize:(CGSize)size withTransitionCoordinator (id<UIViewControllerTransitionCoordinator>)coordinator{ 
     //change constraints 
} 

वैकल्पिक रूप से, अगर आप, ओरिएंटेशन परिवर्तन के बाद की कमी को बदलने viewWillTransitionToSize विधि में समन्वयक वस्तु की animateAlongsideTransition विधि का उपयोग करना चाहते हैं।

-(void)viewWillTransitionToSize:(CGSize)size withTransitionCoordinator:(id<UIViewControllerTransitionCoordinator>)coordinator{ 
    [coordinator animateAlongsideTransition:nil completion:^(id<UIViewControllerTransitionCoordinatorContext> _Nonnull context) { 
     //change constraints 
    }]; 
} 
संबंधित मुद्दे