ios - आईओएस: कैसे नई ऑटोलायआउट बाधा(ऊंचाई) को एनिमेट करता है




uiview autolayout (4)

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

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

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

यहां एक ट्यूटोरियल है

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

पहली चुनौती:

मुझे एक 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] )।

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

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

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

संपादित करें - यह एनीमेशन एनिमेटिंग नहीं है हालांकि दृश्य के नीचे 170 आगे बढ़ता है:

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

    }];

और nibMapViewConstraint नीचे वर्टिकल स्पेस बाधा के लिए आईबी में वायर्ड किया गया है।


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

कंटेनर व्यू पर ऊँचाई बाधा जोड़ने के लिए

 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];
      }
    }];

यह मेरे लिए काम करता है (आईओएस 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];
    }];

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





nslayoutconstraint