2013-06-24 8 views
6

जब कोई उपयोगकर्ता कुछ कार्य करता है, तो मुझे नीचे की ओर से UICollectionView खींचने की आवश्यकता होती है। चूंकि वह नया राज्य पूरी तरह से वैकल्पिक है, इसलिए संग्रह दृश्य इस तरह प्रस्तुत किए जाने से ठीक पहले बनाया गया है। नीचे से शीर्ष तक एनीमेशन NSLayoutConstraint की constant संपत्ति में परिवर्तन और कुछ एनीमेशन ब्लॉक में [view layoutIfNeeded] पर कॉल का उपयोग करके किया जाता है।UICollectionViewCell को एनिमेटेड उपस्थिति को रोकना UICollectionView

समस्या यह है कि, चीजें करने से कोशिकाएं अवांछित तरीके से दिखाई देती हैं: वे अपने शीर्ष बाएं कोने से उनके निर्दिष्ट आकार में विस्तार करते हैं। मैं संग्रह दृश्य को दिखाना चाहता हूं और इसके सभी कक्ष पहले से ही उनके अंतिम आकार और उपस्थिति में रखे गए हैं।

मुझे UIView की setAnimationEnabled: विधि जैसी चीज़ों से अवगत है, लेकिन मुझे लगता है कि मुझे यह कैसे और कहाँ उपयोग करना चाहिए (यदि यह जाने का तरीका है)।

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

+0

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

उत्तर

10

शीर्ष बाएं कोने से विस्तार करना आमतौर पर एनीमेशन ब्लॉक में layoutIfNeeded को कॉल करने का एक लक्षण है जब मूल दृश्य कभी नहीं रखा गया है। आप मूल रूप से आरंभिक लेआउट पास एनिमेट कर रहे हैं, जहां सभी सबव्यूज़ CGRectZero में शुरू हो गए हैं।

इसे हल करने के लिए आप दो चीजों की आवश्यकता:

  • बाधा आप संपादित कर रहे हैं संग्रह देखने के लिए, नहीं आकार के स्थिति से संबंधित है सुनिश्चित करें। इसके द्वारा मेरा मतलब है कि आप अपनी ऊंचाई को शून्य से अंतिम मान में बदलकर अपना संग्रह दृश्य प्रस्तुत नहीं कर रहे हैं।
  • बाधा को संपादित करने से पहले अपने दृश्य पर layoutIfNeeded पर कॉल करें, फिर परिवर्तन करने के बाद इसे फिर से एनीमेशन ब्लॉक में कॉल करें। इस तरह आप पूरे लेआउट की बजाय बाधा में निर्दिष्ट परिवर्तन को केवल एनिमेट कर रहे हैं।
+1

यह काम किया! आपको बहुत - बहुत धन्यवाद! संदर्भ के लिए, मैंने जो किया वह कम प्राथमिकता की बाधा उत्पन्न करने के लिए किया गया था जो संग्रह दृश्य ऊंचाई को विंडो की ऊंचाई के बराबर बना देगा, 'लेआउट IfNeeded' पर कॉल करें, उच्च प्राथमिकता बाधा सेट करें जो पिछले एक को ओवरराइड करेगा, और एनीमेशन निष्पादित करेगी ! और यह खूबसूरती से काम किया! – matehat

+0

मैं केवल 22 घंटों में बक्षीस देने में सक्षम हूं ... – matehat

+0

प्राथमिकताओं का लाभ लेना एक अच्छा विचार है! मैं खुद को कुछ लिखने वाला हूं और मैं आमतौर पर चारों ओर विभिन्न बाधाओं के संदर्भ रखता हूं, लेकिन मैं इस बार अपना रास्ता आजमाउंगा। – jrturton

0

मैं इस समस्या में लगभग 3 दिनों के लिए रहा हूं और अंततः एक समाधान मिला है। , बस मैं एनीमेशन ब्लॉक एक बहुत छोटे टाइमर

UIView.animateWithDuration(0.5, delay: 0, usingSpringWithDamping: 0.5, initialSpringVelocity: 7 , options: .CurveEaseInOut, animations: { 
      self.view.layoutIfNeeded() 
     }){ _ in} 

के बाद कहा जा होगा

let delayTime = dispatch_time(DISPATCH_TIME_NOW, Int64(0.1 * Double(NSEC_PER_SEC))) 
    dispatch_after(delayTime, dispatch_get_main_queue()) { 
     self.changeConstraint() 
    } 

private func changeConstraint(){ 

     UIView.animateWithDuration(0.5, delay: 0, usingSpringWithDamping: 0.5, initialSpringVelocity: 7 , options: .CurveEaseInOut, animations: { 
      self.view.layoutIfNeeded() 
     }){ _ in} 
} 

अपने आवेदन में कुछ इसी तरह की कीड़े में चल रहे जादू :)

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