2012-12-06 15 views
44

घुमाता है जब मैं डिवाइस घुमाने पर लेआउट बाधाओं को संशोधित करना चाहता हूं। मेरा से बना है, परिदृश्य में वे क्षैतिज रूप से गठबंधन हैं, और चित्र में वे लंबवत गठबंधन हैं।डिवाइस ऑटो लेआउट बाधाओं को बदलता है जब डिवाइस

यह काम वास्तव में, willAnimateRotationToInterfaceOrientation में, मैं वांछित कमी अन्य लोगों के साथ सही लेआउट के लिए

को दूर करता है और प्रतिस्थापित उन्हें ... लेकिन वहाँ शुरू होता है willAnimateRotationToInterfaceOrientation से पहले बाधाओं को तोड़ने कहा जाता है रोटेशन ऑटो लेआउट के दौरान, समस्याएं हैं , तो उपकरण पुनरावृत्ति होने पर हमारी बाधाओं को प्रतिस्थापित करने के लिए हम कहां हैं?

एक और मुद्दा यह प्रदर्शन है, कुछ चक्र के बाद सिस्टम अब और बाधाओं को तोड़ने नहीं है, लेकिन मैं विशेष रूप से पोर्ट्रेट मोड में ओवरराइड -(void) viewWillLayoutSubviews अपने UIViewController में अपने बाधाओं को अद्यतन करने के लिए एक विशाल प्रदर्शन ड्रॉप है, ...

+0

कृपया अपना कोड यहां जोड़ें –

+0

@Makleesh: हाँ आप ऑटो लेआउट का उपयोग करते समय बहुत सी समस्याएं उभरते हैं, लेकिन मुझे उन्हें काफी आसान लगता है .. वैसे भी, यह चीजों को करने का नया तरीका होगा, बेहतर होगा देर से अब इसमें। – vitaminwater

+0

@Waseem: मेरे पास वास्तव में पोस्ट करने के लिए कोड नहीं है ... जैसा कि मैंने कहा था कि मेरे कोड को निष्पादित करने से पहले भी बाधाएं टूट गई हैं, इसलिए मुझे नहीं पता कि मैं कौन सा कोड पोस्ट कर सकता हूं! – vitaminwater

उत्तर

49

willRotateToInterfaceOrientation:duration: में, setNeedsUpdateConstraints को किसी भी दृश्य में भेजें जो इसकी बाधाओं को संशोधित करने की आवश्यकता है।

वैकल्पिक रूप से, UIView सबक्लास बनाएं। अपने उप-वर्ग में, UIApplicationWillChangeStatusBarOrientationNotification प्राप्त करने के लिए पंजीकरण करें।जब आप अधिसूचना प्राप्त करते हैं, तो setNeedsUpdateConstraints भेजें।

यह दृश्य पर needsUpdateConstraints ध्वज सेट करता है। सिस्टम लेआउट करने से पहले (layoutSubviews संदेश भेजकर), यह updateConstraints संदेश को किसी भी दृश्य में भेजता है जिसमें needsUpdateConstraints ध्वज सेट है। यह वह जगह है जहां आपको अपनी बाधाओं को संशोधित करना चाहिए। अपनी बाधाओं को अपडेट करने के लिए UIView सबक्लास बनाएं और updateConstraints ओवरराइड करें।

+0

यह बहुत अच्छा है और बेकार ढंग से काम करता है। मेरे कार्यान्वयन में मैं अभिविन्यास-विशिष्ट बाधाओं को जोड़ने से पहले [दृश्य बाधाओं] पर पुन: प्रयास कर रहा हूं और प्रत्येक को हटा रहा हूं। यह एक थोक स्वैप है और एनिमेटेड परिवर्तन बहुत अच्छा लग रहा है। –

+2

क्या आपको हर दृश्य को उप-वर्ग करना होगा जिसमें इसकी बाधाएं संशोधित होंगी, या आप इसे किसी भी तरह से व्यू कंट्रोलर से पूरी तरह से कर सकते हैं? ऐसा लगता है कि घूर्णन परिवर्तनों के लिए कुछ चौड़ाई और ऊंचाइयों को बदलने के लिए एक बहुत ही सामान्य स्थिति होगी, लेकिन अगर आपको कई आंतरिक दृश्यों के लिए कई कस्टम वर्गों के साथ अपना लेआउट भरना है तो बहुत बदसूरत होगा। – Tenfour04

+1

आप शीर्ष-स्तरीय दृश्य के लिए एक कस्टम क्लास बना सकते हैं और उन सब सबव्यूज़ को आउटलेट दे सकते हैं जिन्हें संशोधित बाधाओं की आवश्यकता होती है। फिर आप उस कस्टम क्लास की 'अपडेट कॉन्स्ट्रेनेंट्स' विधि में सभी बाधाओं को स्थापित कर सकते हैं। –

2

नीचे कोड के रूप में:

-(void) viewWillLayoutSubviews { 
    switch(self.interfaceorientation) 
    { 
      case UIInterfaceOrientationLandscapeLeft: 

       break; 
      case UIInterfaceOrientationLandscapeRight: 

       break; 

      case UIDeviceOrientationPortrait: 

       break; 

      case UIDeviceOrientationPortraitUpsideDown: 

       break; 

    } 
} 
+0

लेआउटस्यूब्यूव्स एक यूआईवी व्यू विधि है, यह सुनिश्चित नहीं है कि जाने का रास्ता है, लेकिन धन्यवाद! इस परियोजना को अब भेज दिया गया है, इसलिए मैं वास्तव में इसका परीक्षण नहीं कर सकता हूं, जो आप प्रस्तावित कर रहे हैं उसके निकटतम दृष्टिकोण UIViewController से viewWillLayoutSubviews का उपयोग करना होगा, मुझे लगता है कि मैंने सफलता के बिना कोशिश की थी .. – vitaminwater

+2

सबसे पहले, यदि आप ऑटोलायआउट का उपयोग कर रहे हैं तो आपको '[सुपर लेआउटसब्यूव्यू] 'कॉल करने की आवश्यकता है। दूसरा, आप 'लेआउटसब्यूव्यू' में अपनी बाधाओं को संशोधित नहीं करना चाहते हैं, क्योंकि ** लेआउटस्यूव्यूव्स ** भेजा गया है ** ** सिस्टम ने बाधाओं को हल किया है। यहां बाधाओं को बदलना रन लूप की अगली बारी पर एक और लेआउट पास (नई बाधाओं को हल करने के लिए) को ट्रिगर करेगा। –

+0

ऐसा लगता है कि यहां लागू/ओवरराइड करने की सही विधि 'viewWillLayoutSubviews' होगी। –

13

Matthijs Hollemans पोस्ट में ऑटो-लेआउट और रोटेशन का बहुत अच्छा स्पष्टीकरण है। आप इसे यहाँ पा सकते हैं: http://www.raywenderlich.com/20881/beginning-auto-layout-part-1-of-2

आमतौर पर, आप के बारे में 4 की कमी की जरूरत है सही ढंग से अपने दृष्टिकोण को स्थान देने के लिए। यदि मेरे विचारों का निरंतर आकार है तो मैं ऊंचाई और चौड़ाई पिन करना पसंद करता हूं। इसके बाद आप जो भी चाहें करने के लिए अग्रणी और शीर्ष स्थान की बाधाओं का उपयोग कर सकते हैं। उदाहरण के लिए, आप अपने दृश्यों के लिए और प्रमुख के लिए IBOutlets शीर्ष स्थान की कमी सेट कर सकते हैं:

@interface ViewController : UIViewController { 
    IBOutlet NSLayoutConstraint *_leadingSpaceConstraint; 
    IBOutlet NSLayoutConstraint *_topSpaceConstraint; 
} 

तब को नियंत्रित खींचें आउटलेट से अपने बाधा है। अब आप सीधे कोड से आपके विचार बाधा बदल सकते हैं:

_leadingSpaceConstraint.constant = NEW_CONSTRAINT_VALUE; 

अपने परिवर्तनों को प्रतिबद्ध करने के लिए आप कॉल करने की आवश्यकता:

[self.view layoutIfNeeded]; 

और यह एनिमेटेड अगर आप क्या करना चाहते:

[UIView animateWithDuration:0.25 
       animations:^{ 
        [self.view layoutIfNeeded]; 
       }]; 

मुझे लगता है कि यह willAnimateRotationToInterfaceOrientation में काम करेगा, क्योंकि आपको इस दृष्टिकोण के साथ किसी भी बाधा को तोड़ने की आवश्यकता नहीं है।

कुछ उदाहरण: आपके पास पोर्ट्रेट अभिविन्यास में दो वर्ग दृश्य हैं, एक दूसरे के नीचे। उदाहरण के लिए, "पर्यवेक्षण में अग्रणी स्थान" बाधाओं को 20 तक सेट करें। फिर पहले दृश्य के लिए "पर्यवेक्षण बाधा के लिए शीर्ष स्थान" सेट करें और 120 के लिए 120 पर सेट करें। यह हमारा डिफ़ॉल्ट सेटअप होगा।

फिर, घूर्णन के बाद आपको अपनी बाधाओं को फिर से समझना होगा। अब दोनों शीर्ष बाधाओं को 20 तक सेट करें, और क्रमशः 20 और 120 तक प्रमुख बाधाएं सेट करें। फिर लेआउट के साथ परिवर्तन करें IFNeeded।

मुझे आशा है कि इससे मदद मिलेगी।

+0

मुझे लगता है कि आप ऑटोलायआउट के उद्देश्य को हरा रहे हैं, यदि आप एक निश्चित चौड़ाई और ऊंचाई निर्धारित करते हैं, और स्थिति के लिए शीर्ष/बाएं स्थान जोड़ते हैं, तो आप वसंत और स्ट्रेट्स से ज्यादा कुछ नहीं कर रहे हैं। निश्चित रूप से ऐसा करने से कोई बोर्कन बाधाएं नहीं हैं क्योंकि आप अपने विचारों को एक साथ जोड़कर कोई बाधा नहीं जोड़ रहे हैं; उदाहरण के लिए, यदि आपको एक से अधिक स्क्रीन आकार/अनुपात का प्रबंधन करना है, तो आपको विशेष मामले बनाना होगा, जो ऑटोलायआउट से बचने के लिए होता है! – vitaminwater

+0

मुझे लगता है कि यह सिर्फ एक विशेष मामला है। आपको निश्चित आकार और गतिशील स्थिति की आवश्यकता है - आप इसे प्राप्त कर सकते हैं। आपको गतिशील आकार की आवश्यकता है - आप इसे भी प्राप्त कर सकते हैं। Autolayout आपको कब और कहाँ चाहते हैं गतिशीलता लागू करने की अनुमति देता है। वसंत और स्ट्रेट्स - नहीं। – Flar

+0

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

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