2014-10-09 7 views
6

मैं एक UIKitDynamics UISnapBehaviour उपयोग करना चाहते हैं कि एक बटन ही ऑटो लेआउट का उपयोग कर एक दृश्य में रखा जाता है की एनीमेशन (रोटेशन पर उपस्थिति + स्थिति परिवर्तन) को मसाले को।चेतन ऑटो लेआउट समर्थित दृश्य का उपयोग कर UIKitDynamics

मैं समझता हूं कि UIKitDynamics बलों को लागू करते समय मुझे अस्थायी रूप से बटन से स्वत: लेआउट बाधाओं को अक्षम करने की आवश्यकता है। मैं निम्नलिखित प्रक्रिया के बारे में सोच रहा हूँ ...

  1. लक्ष्य केन्द्र/सीमा ऑटो लेआउट आधारित संक्रमण होता है से पहले बटन की जाओ (लेकिन बाद यह शुरू हो रहा है)। उस मूल्य को बचाओ।
  2. अस्थायी रूप से अक्षम सभी ऑटो लेआउट/बटन की कमी
  3. UISnapBehaviour लागू करें। इसे सहेजे गए लक्ष्य केंद्र या ऑटो लेआउट से सीमा शुल्क (चरण 1 से) के साथ फ़ीड करें।
  4. जब UIKitDynamics एनीमेशन समाप्त हो गया है पुन: सक्षम की कमी किसी भी आगे लेआउट परिवर्तन

यह सही दृष्टिकोण है के लिए तैयार करने के लिए?

कौन सा प्रतिनिधि/लेआउट उन उन संबंधित चरणों + मैं कैसे वास्तविक ऑटो लेआउट आधारित एनीमेशन/संक्रमण होता है से पहले ऑटो लेआउट से एक दृश्य की लक्ष्य केंद्र मिलता है के लिए इस्तेमाल किया जाना चाहिए?

+2

ऑटो-लेआउट के साथ UIKitDynamics का उपयोग करने के लिए आपको वास्तव में किसी दृश्य पर बाधाओं को अक्षम करने की आवश्यकता नहीं है। एक साफ चाल है जिसने मुझे कुछ समय पहले दिखाया था, कि यदि आप के अनुरूप एक कस्टम NSObject बनाते हैं, तो इस कस्टम आइटम में एक व्यवहार जोड़ें और फिर व्यवहार के क्रिया ब्लॉक में बाधाओं को बदलें। – DBoyer

+1

यह सही उत्तर है, बाधाओं को एनिमेट करें, फ्रेम नहीं। – Gusutafu

उत्तर

2

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

उछाल प्रभाव के लिए दृश्य के रूप में दृश्य

// create the view 

UIView *view = ...; 
view.translatesAutoresizingMaskIntoConstraints = NO; 
[self.view addSubview:view]; 

// add all of the constraints for the final position 

NSDictionary *views = NSDictionaryOfVariableBindings(view); 
[self.view addConstraints:...]; 

// animate the application of those constraints with low `withSpringWithDamping` 

[UIView animateWithDuration:1.0 delay:0.0 usingSpringWithDamping:0.5 initialSpringVelocity:0.0 options:0 animations:^{ 
    [view layoutIfNeeded]; 
} completion:nil]; 

आप भी कुछ रोटेशन चाहते हैं के रूप में यह जगह में तस्वीरें, आप उपयोग कर सकते हैं animateKeyframesWithDuration: जगह, आप animateWithDurationusingSpringWithDamping साथ पैरामीटर, जैसे उपयोग कर सकते हैं

[UIView animateKeyframesWithDuration:1.0 delay:0.0 options:0 animations:^{ 
    [UIView addKeyframeWithRelativeStartTime:0.0 relativeDuration:0.5 animations:^{ 
     view.transform = CGAffineTransformMakeRotation(M_PI_4/2); 
    }]; 
    [UIView addKeyframeWithRelativeStartTime:0.5 relativeDuration:0.25 animations:^{ 
     view.transform = CGAffineTransformMakeRotation(-M_PI_4/4); 
    }]; 
    [UIView addKeyframeWithRelativeStartTime:0.75 relativeDuration:0.125 animations:^{ 
     view.transform = CGAffineTransformMakeRotation(M_PI_4/16); 
    }]; 
    [UIView addKeyframeWithRelativeStartTime:0.875 relativeDuration:0.125 animations:^{ 
     view.transform = CGAffineTransformMakeRotation(0); 
    }]; 
} completion:nil]; 

यह ठीक UISnapBehavior नहीं है , लेकिन यह लगभग बारीकी से अनुमान लगाता है। आप मुख्य फ्रेम एनीमेशन के साथ-साथ वसंत नमी कारक में घूर्णन के समय और रोटेशन के साथ भी खेल सकते हैं। लेकिन यह ब्लॉक-आधारित एनीमेशन का उपयोग करके स्नैप-जैसे व्यवहार प्राप्त करने के लिए एक दृष्टिकोण को दर्शाता है।

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