2013-02-14 44 views
37

एक परीक्षण के रूप में मैंने एक लेआउट बनाया जो लंबवत रेखा में कोशिकाओं को प्रदर्शित करता है और दूसरा जो उन्हें क्षैतिज लेआउट में प्रदर्शित करता है। जब मैं [collectionView setCollectionViewLayout:layout animated:YES]; पर कॉल करता हूं तो यह दो पदों के बीच बहुत साफ रूप से एनिमेट करता है।कस्टम एनीमेशन एक UICollectionViewLayout से दूसरे पर स्विच करते समय?

अब जब कि मैं तरह चाहते करने के लिए, सभी दृश्यों में कुछ स्पिन करना है warps और अंत में अपने गंतव्य पर पहुंचने से पहले स्क्रीन (शायद CAKeyframeAnimations का प्रयोग करके) के आसपास flips, लेकिन मैं एक अच्छा नहीं मिल सकता है में इस हुक करने जगह।

मैं UICollectionViewLayoutAttributes उपवर्गीकरण एक एनीमेशन संपत्ति को शामिल करने की कोशिश की, तो UICollectionViewCell मैं उपयोग कर रहा हूँ का एक अधिरोहित applyLayoutAttributes: विधि में उन एनिमेशन की स्थापना। यह काम करता है ... ऐसा लगता है कि के बाद लेआउट संक्रमण पूरा हो गया है। अगर मैं इसका उपयोग करना चाहता था, तो मुझे लेआउट को तुरंत ऑब्जेक्ट्स की वर्तमान स्थिति में बदलाव नहीं करना पड़ेगा, केवल कोड के लागू होने वाले गुणों तक पहुंचने के बाद, और यह बहुत सारे काम की तरह लगता है ...

या मैं UICollectionView उपclass कर सकता हूं और setCollectionViewLayout:animated: ओवरराइड कर सकता हूं, लेकिन यह लेआउट के बीच रखने के लिए बहुत सारे राज्य की तरह लगता है। इन ऑप्टिन्स में से कोई भी सही नहीं लगता है, क्योंकि ऐसेके के भीतर कक्षों के अतिरिक्त/हटाने को एनिमेट करने का एक आसान तरीका है। मुझे लगता है कि एनीमेशन में लेआउट के बीच हुकिंग के लिए कुछ समान होना चाहिए।

क्या कोई मुझे पूरा करने के लिए सबसे अच्छा तरीका जानता है?

+0

क्या आप अपना कोड दिखा सकते हैं? – zakhej

उत्तर

8
#define degreesToRadians(x) (M_PI * (x)/180.0) 

UICollectionView *collectionView = self.viewController.collectionView; 
HorizontalCollectionViewLayout *horizontalLayout = [HorizontalCollectionViewLayout new]; 
NSTimeInterval duration = 2; 


[collectionView.visibleCells enumerateObjectsUsingBlock:^(UICollectionViewCell *cell, NSUInteger index, BOOL *stop) 
{ 
    CABasicAnimation *rotationAnimation; 
    rotationAnimation = [CABasicAnimation animationWithKeyPath:@"transform.rotation"]; 
    rotationAnimation.toValue = @(degreesToRadians(360)); 
    rotationAnimation.duration = duration; 
    rotationAnimation.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut]; 

    [cell.layer addAnimation:rotationAnimation forKey:@"rotationAnimation"]; 
}]; 

[UIView animateWithDuration:duration 
       animations:^ 
{ 
    collectionView.collectionViewLayout = horizontalLayout; 
}]; 
+0

आप इस कोड को कहां जोड़ रहे हैं, कृपया? – vitaminwater

+0

ड्वोरक, आपने यह कोड कहां रखा? – jj0b

+1

धन्यवाद यह मेरे लिए काम करता है ... – vipulkumarmehta