2012-09-22 17 views
6

मैं insertItemsAtIndexPaths या moveItemAtIndexPath:toIndexPath: जैसी चीजों की बात कर रहा हूं। मैंने इसे एनीमेशन ब्लॉक में लपेटने की कोशिश की है, लेकिन यह काम नहीं किया। ऐसा लगता है कि एनिमेशन .25 या .3 सेकंड पर फंस गए हैं, लेकिन मैं इसे धीमा करना चाहता हूं। आंदोलन को लागू करने के अलावा, जो मुसीबत के लायक नहीं है, क्या किसी को पता है कि सार्वजनिक एपीआई के साथ यह संभव है या नहीं?क्या UICollectionViews के लिए एनिमेशन की गति को बदलने का कोई तरीका है?

उत्तर

5

बिल्कुल! लेकिन आप UIView एनीमेशन ब्लॉक का उपयोग करके इसे ठीक से नहीं कर सकते हैं। आपको कोर एनीमेशन में खोदने की जरूरत है।

संग्रह दृश्य CALayer पर एनिमेशन को सक्रिय रूप से जोड़ता है जो प्रत्येक UICollectionViewCell का समर्थन कर रहा है। लेकिन यदि आप अपना खुद का लेआउट लागू करते हैं (या मौजूदा में सबक्लास) तो आप finalizeCollectionViewUpdates विधि में इन एनिमेशन में सभी आवश्यक संशोधन कर सकते हैं।

UICollectionViewLayout वर्ग प्रलेखन से

:

संग्रह दृश्य कॉल जगह में कोई भी परिवर्तन चेतन करने के लिए पूर्ववर्ती से पहले अंतिम चरण के रूप में इस विधि।

यहाँ कैसे अपने खुद के साथ डिफ़ॉल्ट स्थिति को बदलने के लिए एनीमेशन का एक उदाहरण है:

- (void)finalizeCollectionViewUpdates 
{ 
    for (UICollectionViewCell *cell in [self.collectionView visibleCells]) 
    { 
     CAAnimation *positionAnimation = [cell.layer animationForKey:@"position"]; 
     if (positionAnimation) 
     { 
      [cell.layer removeAnimationForKey:@"position"]; 

      CALayer *presentationLayer = cell.layer.presentationLayer; 
      CABasicAnimation *animation = [CABasicAnimation animationWithKeyPath:@"position"]; 
      [animation setFromValue:[NSValue valueWithCGPoint:presentationLayer.position]]; 
      [animation setToValue:[NSValue valueWithCGPoint:cell.layer.position]]; 
      [animation setDuration:0.4]; 

      [cell.layer addAnimation:animation forKey:@"position"]; 
     } 
    } 
} 
CALayer पर एनीमेशन से संबंधित तरीकों पर

देखो देखने के लिए आप कैसे खुदाई कर सकते हैं क्या में एनिमेशन वर्तमान में चल रहे आपकी परत पर

इस दृष्टिकोण का उपयोग करके आप रचनात्मक भी हो सकते हैं और CAKeyframeAnimation या किसी अन्य चीज का उपयोग कर ओवरहूट/बाउंस प्रभाव जोड़ सकते हैं। आप चीजों को कुछ एनिमेशन (जैसे आकार) को चुनिंदा रूप से अक्षम कर सकते हैं और दूसरों को (स्थिति की तरह) रख सकते हैं।

1

प्रतिलिपि बनाई जा रही यहां से इस पर: https://stackoverflow.com/a/18392148/1751266

आप CALayer के साथ किसी भी एनीमेशन की गति बदल सकते हैं। तो UICollectionView के लिए इस तरह दिखता है:

[self.collectionView.viewForBaselineLayout.layer setSpeed:0.1f]; 

और तुम मूल गति वापस बदल सकते हैं:

#import <QuartzCore/QuartzCore.h> 

: यह आपके QuartzCore आयात करने के लिए आवश्यकता हो सकती है काम करने के लिए

[self.collectionView.viewForBaselineLayout.layer setSpeed:1.0f]; 

बस ध्यान रखें कि यह एनिमेटेड UIImageViews सहित एक ही परत पर किसी भी अन्य एनिमेशन को प्रभावित करता है और ऐसे में उन्हें क्षतिपूर्ति की आवश्यकता हो सकती है।