2015-02-01 9 views
10

स्टोरीबोर्ड में ऑटो लेआउट का उपयोग करते समय एक बाधा स्थापित करने के लिए एक विकल्प है या नहीं "इंस्टॉल" चेकबॉक्स के साथ। इसे अक्षम करने से यह व्यवहार हो जाएगा जैसे कि आपने उस बाधा को नहीं जोड़ा - इसका कोई प्रभाव नहीं पड़ेगा। आप इंटरफ़ेस बिल्डर में विभिन्न आकार वर्गों के लिए स्थापित स्थिति को कॉन्फ़िगर कर सकते हैं, और आप active प्रॉपर्टी को true या false पर सेट करके प्रोग्रामेटिक रूप से इस मान को बदल सकते हैं।ऑटो लेआउट बाधा के लिए "स्थापित" कहां बदलें?

मेरे ऐप में मैं जबकि डिवाइस चित्र में है की कोई समस्या ही स्थापित करना चाहते हैं - यह "की स्थापना रद्द" किया जाना चाहिए जब परिदृश्य के लिए घूर्णन। यह किसी भी चौड़ाई कॉम्पैक्ट ऊंचाई के लिए स्थापित अनचेक करके iPhones के लिए पूरा किया जा सकता है। (हालांकि यह काफी सही काम नहीं कर रहा है क्योंकि यह विरोधाभासी बाधाओं के कारण इस बाधा को तोड़ता है जब इसे परिदृश्य में घूमते समय भी स्थापित नहीं किया जाना चाहिए, लेकिन जब भी यूआई हमेशा अपेक्षित दिखाई देता है।) लेकिन अनइंस्टॉल करने का कोई तरीका नहीं है इंटरफ़ेस बिल्डर में परिदृश्य में आईपैड के लिए बाधा (यह दोनों ओरिएंटेशन में नियमित चौड़ाई नियमित ऊंचाई है)।

डिवाइस को घूर्णन करते समय NSLayoutConstraint एस के लिए active को सक्षम/अक्षम करने के लिए उचित स्थान कहां है? क्या रोटेशन विधि उस स्थिति को बदलती है वांछित व्यवहार में परिणाम - केवल पोर्ट्रेट के लिए स्थापित किया जा सकता है? यदि ऐप लॉन्च पर उस विधि को नहीं कहा जाता है, तो रोटेशन विधि के अतिरिक्त इसे अन्य विधि में कैसे रखा जाना चाहिए?

मैं viewDidLoad और viewWillTransitionToSize में निम्न कोड रखने की कोशिश की है, लेकिन जब आईपैड पर चल रहे इस कुछ अनपेक्षित व्यवहार में परिणाम:

  • परिदृश्य में एप्लिकेशन का शुभारंभ कारण बनता बाधा तथ्य सक्रिय होने के बावजूद सक्रिय होने के लिए गलत पर सेट किया गया था, यह बाधा टूट जाता है, और यूआई के रूप में उम्मीद
  • प्रकट नहीं होता है का शुभारंभ चित्र में एप्लिकेशन (यह पहले से ही आईबी में स्थापित किया गया था) सच करने के लिए सक्रिय सेट तो यह अपेक्षा के अनुरूप
  • काम करता है अनुप्रयोग का शुभारंभ चित्र में और घूर्णन परिदृश्य के लिए उपकरण के रूप में की उम्मीद काम करता है - बाधा निष्क्रिय करने के लिए सेट कर दिया जाता है, यह बाधा नहीं तोड़ता है, यूआई उम्मीद
  • चित्र में एप्लिकेशन का शुभारंभ, परिदृश्य के लिए घूर्णन, और वापस चित्र करने के लिए सही प्रकट करने के लिए यूआई का कारण बनता है, लेकिन रूप में प्रकट होता यह इस बाधा को तोड़ता है जो सक्रिय

यदि मैं इंटरफ़ेस बिल्डर में बाधा को अनइंस्टॉल करता हूं तो उपर्युक्त परिदृश्य चलाता हूं, मुझे अनिवार्य रूप से विपरीत व्यवहार मिलता है।

if size.width > size.height { 
    self.myConstraint.active = false 
} else { 
    self.myConstraint.active = true 
} 

उत्तर

0

मैं कर रहा हूँ एक सा जवाब देने के लिए देर से, लेकिन यहाँ मेरी 2 सेंट है जब मैं autolayout के पास iOS 7 iPhone के लिए कॉम्पैक्ट चौड़ाई/कॉम्पैक्ट ऊंचाई पता लगाने के लिए अक्षमता की समस्या को हल करने के लिए एक समान समस्या का सामना करना पड़ा। आईओएस 7 में activated संपत्ति नहीं है, इसलिए मुझे उन्हें जोड़ना/हटाना पड़ा।

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

यहाँ मेरी बाधा पदच्युत विधि है:

-(void)removeiOS7andiPhone4inLandscapeToOrientation:(UIInterfaceOrientation)toInterfaceOrientation{ 

    if(!UIInterfaceOrientationIsLandscape(toInterfaceOrientation)&&(NSFoundationVersionNumber<=NSFoundationVersionNumber_iOS_7_1)&&(UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPhone)){ 
     // if iPhone with iOS 7 on portrait remove Constraints here 

    } 
} 

और यहाँ बाधा योजक विधि है:

-(void)addiOS7andiPhone4inLandscapeToOrientation:(UIInterfaceOrientation)toInterfaceOrientation{ 

    if(UIInterfaceOrientationIsLandscape(toInterfaceOrientation)&&(NSFoundationVersionNumber<=NSFoundationVersionNumber_iOS_7_1)&&(UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPhone)){ 
     // if iPhone with iOS 7 on landscape add Constraints here 

    } 

} 

जहां इन तरीकों कॉल करने के लिए, जैसा कि आप की कोशिश की, में उन दोनों के फोन के रूप में viewWillAppear (viewWillDisappear में कॉल करने की कोई आवश्यकता नहीं है) और viewWillTransitionToSize (मेरे मामले में यह willRotateToInterfaceOrientation है, क्योंकि viewWillTransitionToSize केवल आईओएस 8 के बाद उपलब्ध है)। उन्हें बाद में कॉल करना समझ में आता है, आवश्यक परिवर्तन करने से पहले, उनमें से केवल एक ही अपने पोर्ट्रेट/लैंडस्केप ओरिएंटेशन को if के साथ जांचने के बाद चलाया जाएगा।

-(void)willRotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration{ 

    [super willRotateToInterfaceOrientation:toInterfaceOrientation duration:duration]; 

    // this will be run only if orientation is on Portrait 
    [self addiOS7andiPhone4inLandscapeToOrientation:toInterfaceOrientation]; 

    // this will be run only if orientation is on Landscape 
    [self removeiOS7andiPhone4inLandscapeToOrientation:toInterfaceOrientation]; 
} 

और viewWillAppear में एक ऐसी ही फोन करना:

और यहाँ मेरी willRotateToInterfaceOrientation विधि परिभाषा है।

नोटिस: सुनिश्चित करें कि आप इन तरीकों में ठीक विपरीत कर रहे हैं, और आप जरूरी केवल addConstraintMethod में कमी जोड़ सकते हैं और न निकालें केवल removeConstraintMethod में। मेरे मामले में, मैं दोनों उनमें से प्रत्येक में बाधाओं को जोड़ता और निकालता हूं, इसलिए विधियों का नामकरण वास्तव में उनकी वास्तविक भूमिका को प्रतिबिंबित नहीं करता है, लेकिन जब तक आप सही विरोध कर रहे हैं, तब तक आप जाने के लिए अच्छे हैं।

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