2012-11-08 27 views
113

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

सबसे पहले चुनौती:

मैं एक MKMapView का आकार बदलना होगा और मैं नए स्थान पर ले चेतन करना चाहते हैं।

[UIView animateWithDuration:1.2f 
    animations:^{ 
     CGRect theFrame = worldView.frame; 
     CGRect newFrame = CGRectMake(theFrame.origin.x, theFrame.origin.y, theFrame.size.width, theFrame.size.height - 170); 
     worldView.frame = newFrame; 
}]; 

... तो MKMapView 'तस्वीर' अपनी मूल ऊंचाई जब भी एक भाई को देखने के लिए अद्यतन हो जाता है (मेरे मामले में एक UISegmentedControl के शीर्षक अद्यतन किया जा रहा है होगा: मैं इस तरह से करना अगर मैं करने के लिए इस्तेमाल कर रहा हूँ [myUISegmentedControl setTitle:newTitle forSegmentAtIndex:0])।

तो, मैं क्या सोचता मुझे क्या करना UISegmentedControl के शीर्ष के सापेक्ष होने के जनक दृश्य के hight के बराबर होने से MKMapView की कमी बदल गया है कि यह को कवर किया गया हैं: V:[MKMapView]-(16)-[UISegmentedControl]

जो मैं चाहता हूं वह MKMapView ऊंचाई को छोटा करने के लिए है ताकि मानचित्र दृश्य के नीचे कुछ नियंत्रण प्रकट हो जाएं। ऐसा करने के लिए मैं सोचता हूं मुझे एक निश्चित पूर्ण आकार दृश्य से बाधा को बदलने की आवश्यकता है, जहां नीचे UISegmentedControl के शीर्ष पर बाध्य है ... और मैं इसे एनिमेट करना चाहता हूं क्योंकि दृश्य नए आकार में घटता है।

कोई इस बारे में कैसे जाता है?

[UIView animateWithDuration:1.2f 
     animations:^{ 
      self.nibMapViewConstraint.constant = -170; 

    }]; 

और nibMapViewConstraint नीचे कार्यक्षेत्र अंतरिक्ष बाधा को आईबी में वायर्ड है: -

संपादित इस एनीमेशन नहीं एनिमेट हालांकि दृश्य के निचले भाग तक 170 तुरन्त ले जाने करता है।

+1

मुझे पता है कि आप आसानी से एक [UIView animateWithDuration में बाधा के लगातार मूल्य बदल सकते हैं साथ containerView की ऊंचाई बाधा अद्यतन करने के लिए। ।] ऊंचाई परिवर्तन को एनिमेट करने के लिए ब्लॉक। आपको उस बाधा के लिए एक आईबीओलेट बनाने की आवश्यकता है और इसे अपने xib में हुक करें, या अन्यथा इसे संदर्भ में रखें यदि आपने इसे कोड में बनाया है (या इसके लिए सभी बाधाओं के माध्यम से लूप)। निश्चित नहीं है कि संबंधित परिवर्तनों को कैसे एनिमेट किया जाए, लेकिन मैंने पढ़ा है कि आपको केवल स्थिरता बदलनी चाहिए, न कि बाधा के अन्य मूल्यों (अन्य मानों के लिए, एक नई बाधा बनाएं)। – yuf

+0

हम्म। सोचा कि मैं कर सकता था लेकिन मैं एनिमेटिंग नहीं कर रहा हूँ। यह एनीमेशन ब्लॉक में बदलता है, सफलतापूर्वक, और है, लेकिन * एनिमेटिंग नहीं है! – Meltemi

+0

मेरा उत्तर यहां मिला: Meltemi

उत्तर

165

अपने बाधा अद्यतन करने के बाद:

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

युक्त दृश्य के लिए एक संदर्भ के साथ self.view बदलें।

+4

जो दृश्य के लिए स्वयं काम करता है, हालांकि विचार उस दृश्य में बाधाएं तुरंत चलती हैं। मैं क्या करूं? ty – dietbacon

+7

यदि आपको उन विचारों पर भी आवश्यक हो तो लेआउट को कॉल करने की आवश्यकता है। हालांकि यह वास्तव में ठीक से काम नहीं करता है क्योंकि इससे दृश्य रीफ्रेश भी एनिमेट हो जाएगा। आप केवल अन्य विचारों में बाधा समायोजन को कैसे एनिमेट करते हैं? – ngb

+3

** सावधान रहें: ** यदि 'UIViewAnimationOptionBeginFromCurrentState' का उपयोग करना है तो लेआउट बाधाएं * पहले * एनीमेशन सेट की जाएंगी! – Robert

11

सेब से एक बहुत अच्छा ट्यूटोरियल है जो बताता है कि ऑटोलायआउट के साथ एनीमेशन का उपयोग कैसे करें। इस link का पालन करें और फिर "उदाहरण के द्वारा ऑटो लेआउट" नामक वीडियो ढूंढें यह ऑटोलायआउट के बारे में कुछ रोचक सामग्री देता है और अंतिम भाग एनीमेशन का उपयोग करने के बारे में है।

3

मैंने this small demo available बनाया है। यह दिखाता है कि ऑटो-लेआउट बाधाओं को कैसे बदला जा सकता है और एक बहुत ही सरल उदाहरण में एनिमेटेड किया जा सकता है। बस पर एक नज़र डालें।

82

यह मेरे लिए काम करता है (आईओएस 7 और आईओएस 8 + दोनों)। ऑटो लेआउट बाधा पर क्लिक करें जिसे आप समायोजित करना चाहते हैं (इंटरफ़ेस बिल्डर में शीर्ष बाधा में)।इसके बाद इसे एक आईबीओलेट बनाएं;

@property (strong, nonatomic) IBOutlet NSLayoutConstraint *topConstraint; 

ऊपर एनिमेट करें;

self.topConstraint.constant = -100;  
    [self.viewToAnimate setNeedsUpdateConstraints]; 
    [UIView animateWithDuration:1.5 animations:^{ 
     [self.viewToAnimate layoutIfNeeded]; 
    }]; 

चेतन वापस मूल स्थान पर

self.topConstraint.constant = 0;  
    [self.viewToAnimate setNeedsUpdateConstraints]; 
    [UIView animateWithDuration:1.5 animations:^{ 
     [self.viewToAnimate layoutIfNeeded]; 
    }]; 
+2

वाह !! यह वास्तव में वास्तव में काम करता है!यह जवाब मेरे लिए एक आंख खोलने वाला था। बहुत बहुत धन्यवाद! - एरिक –

+2

@ एरिकवेंडरनट यह मेरे लिए भी था, खुशी है कि यह सहायक था। मैं फ्रेम स्थिति की बजाय अब से एनिमेटिंग बाधाओं के लिए जा रहा हूँ। – DevC

1

अधिकांश लोगों को अपने विचारों पर लेआउट आइटम के लिए autolayout का उपयोग करें और संशोधित लेआउट एनिमेशन बनाने तक रोकें।

बहुत सारे कोड के बिना ऐसा करने का एक आसान तरीका UIView बना रहा है जिसे आप स्टोरीबोर्ड में एनिमेट करना चाहते हैं और फिर एक छुपा UIView बनाना जहां आप UIView को समाप्त करना चाहते हैं। आप यह सुनिश्चित करने के लिए एक्सकोड में पूर्वावलोकन का उपयोग कर सकते हैं कि UIViews दोनों हैं जहां आप उन्हें बनना चाहते हैं। इसके बाद, समाप्त UIView को छुपाएं और लेआउट बाधाओं को स्वैप करें।

एसबीपी नामक लेआउट बाधाओं को स्वैप करने के लिए एक पॉडफ़ाइल है यदि आप इसे स्वयं लिखना नहीं चाहते हैं।

Here's a tutorial

0

कोई ज़रूरत नहीं KVConstraintExtensionsMaster लाइब्रेरी का उपयोग कर किसी भी दृश्य पर इस आप सीधे access या update पहले से ही लागू किया बाधा या तो लागू किया जा सकता है के बजाय बाधा के IBOutlet reference अधिक उपयोग करने के लिए Programmatically द्वारा या Interface Builder से। यह लाइब्रेरी NSLayoutConstraint का व्यवहार भी प्रबंधित कर रही है।

containerView

CGFloat height = 200; 
[self.containerView applyHeightConstrain:height]; 

पर ऊंचाई बाधा को जोड़ने के लिए एनीमेशन

[self.containerView accessAppliedConstraintByAttribute:NSLayoutAttributeHeight completion:^(NSLayoutConstraint *expectedConstraint){ 
     if (expectedConstraint) { 
      expectedConstraint.constant = 100; 

      /* for the animation */ 
      [self.containerView updateModifyConstraintsWithAnimation:NULL]; 
     } 
    }]; 

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

  • कोई संबंधित समस्या नहीं^_^