10

का उपयोग कर रहा नए iOS 7 एपीआई कि UICollectionViewLayout रों के बीच संक्रमण सहित इंटरैक्टिव, एनिमेटेड दृश्य नियंत्रक संक्रमण, के लिए अनुमति देने पर एक संभाल पाने के लिए कोशिश कर रहा हूँ।UICollectionView इंटरैक्टिव लेआउट संक्रमण iOS 7 एपीआई

मैं ले लिया और WWDC 2013 से नमूना कोड संशोधित कर लिया है, "आईओएस-CollectionViewTransition", यहां पाया जा सकता है जो: https://github.com/timarnold/UICollectionView-Transition-Demo

मूल डेमो है, जो एक काम कर रहे राज्य में जब मुझे मिल नहीं था, यह कर सकते हैं एक एप्पल डेवलपर खाते, यहाँ के साथ पहुँचा जा: https://developer.apple.com/downloads/index.action?name=WWDC%202013

अनुप्रयोग के मेरे संस्करण दो लेआउट, विभिन्न गुणों के साथ दोनों UICollectionViewFlowLayout लेआउट के साथ एक संग्रह दृश्य प्रस्तुत करता है। पहले लेआउट में एक सेल पर

दोहन ठीक से दूसरे को एनिमेट, सहित महत्वपूर्ण, टैप-ऑन-आइटम नए लेआउट में करने के लिए स्क्रॉल किया जा रहा है। सबसे पहले मैं इस बारे में उलझन में था कि नया संग्रह दृश्य अपनी सामग्री को ऑफ़सेट करने के लिए कैसे जानता है ताकि उपयुक्त सेल दिखाई दे, लेकिन मैंने सीखा यह प्रस्तुत संग्रह दृश्य की selected संपत्ति पर आधारित है।

पहले लेआउट में किसी आइटम पर पिंचिंग UICollectionViewTransitionLayout, UIViewControllerAnimatedTransitioning, और UIViewControllerInteractiveTransitioning का उपयोग करके नए लेआउट में भी एनिमेट करना चाहिए। यह काम करता है, लेकिन चुने हुए सेल पर नए लेआउट या संक्रमण लेआउट में स्क्रॉल नहीं किया गया है।

मैंने विभिन्न स्थानों पर चुने हुए सेल पर selected संपत्ति सेट करने का प्रयास किया है (किसी भी आइटम को नए दृश्य नियंत्रक को धक्का देने के लिए वर्णित व्यवहार की नकल करने की कोशिश करने के लिए), कोई फायदा नहीं हुआ।

कैसे इस समस्या को हल करने के बारे में कोई भी विचार?

उत्तर

19

आप संक्रमण के दौरान contentOffset स्वयं को कुशल बना सकते हैं, जो वास्तव में UICollectionView's अंतर्निहित एनीमेशन से आपको बेहतर-नियंत्रित नियंत्रण प्रदान करता है।

उदाहरण के लिए, अगर आप इस तरह अपने संक्रमण लेआउट "के लिए" और "से" ऑफसेट के बीच अंतर्वेशन को परिभाषित कर सकते हैं। तुम बस गणना करने के लिए अपने आप को ऑफसेट "से" आप कैसे चीजों को समाप्त करना चाहते हैं के आधार पर की जरूरत है:

@interface MyTransitionLayout : UICollectionViewTransitionLayout 
@property (nonatomic) CGPoint fromContentOffset; 
@property (nonatomic) CGPoint toContentOffset; 
@end 

#import "MyTransitionLayout.h" 
@implementation MyTransitionLayout 

- (void) setTransitionProgress:(CGFloat)transitionProgress 
{ 
    super.transitionProgress = transitionProgress; 
    CGFloat f = 1 - transitionProgress; 
    CGFloat t = transitionProgress; 
    CGPoint offset = CGPointMake(f * self.fromContentOffset.x + t * self.toContentOffset.x, f * self.fromContentOffset.y + t * self.toContentOffset.y); 
    self.collectionView.contentOffset = offset; 
} 

@end 

एक बात ध्यान रखें कि contentOffset मूल्य "से" पर रीसेट जब संक्रमण पूर्ण हो जाएगा, लेकिन आप नकारना सकता है कि इसे वापस करने के लिए startInteractiveTransitionToCollectionViewLayout

CGPoint toContentOffset = ...; 
[self.collectionViewController.collectionView startInteractiveTransitionToCollectionViewLayout:layout completion:^(BOOL completed, BOOL finish) { 
    if (finish) { 
     self.collectionView.contentOffset = toContentOffset; 
    } 
}]; 

अद्यतन

के पूरा होने के ब्लॉक में ऑफसेट "से" की स्थापना करके मैं इस के एक कार्यान्वयन और एक काम कर परीक्षा तैनात एक नई गिटहब पुस्तकालय TLLayoutTransitioning में ple। उदाहरण गैर-इंटरैक्टिव है, जिसका उद्देश्य setCollectionViewLayout:animated:completion पर बेहतर एनीमेशन प्रदर्शित करना है, लेकिन यह ऊपर वर्णित तकनीक के साथ इंटरैक्टिव ट्रांज़िशनिंग एपीआई का उपयोग करता है। TLTransitionLayout class पर एक नज़र डालें और उदाहरण वर्कस्पेस में "Resize" example चलाने का प्रयास करें।

शायद TLTransitionLayout पूरा कर सकते हैं कि तुम क्या जरूरत है।

अद्यतन 2

मैं TLLayoutTransitioning पुस्तकालय के लिए एक इंटरैक्टिव उदाहरण गयी। उदाहरण वर्कस्पेस में "Pinch" example चलाने का प्रयास करें। यह एक समूह के रूप में दृश्य कोशिकाओं को चुराता है। मैं एक और उदाहरण पर काम कर रहा हूं जो एक व्यक्तिगत सेल को चुराता है जैसे सेल संक्रमण के दौरान आपकी उंगलियों का पालन करता है जबकि अन्य कोशिकाएं डिफ़ॉल्ट रैखिक पथ का पालन करती हैं।

अद्यतन 3

मैं हाल ही में और अधिक सामग्री ऑफसेट प्लेसमेंट विकल्प जोड़ दिया है: न्यूनतम, केंद्र, ऊपर, वाम, नीचे और ठीक है। और transitionToCollectionViewLayout: अब वॉरेन मूर के AHEasing library की 30+ आसान कार्य सौजन्य का समर्थन करता है।

+0

यह आशाजनक लग रहा है, मैं वास्तव में एक नज़र डालने के लिए उत्साहित हूं और देख रहा हूं कि यह मेरे मुद्दों को हल करता है या नहीं। एक प्रश्न: क्या वास्तव में एक इंटरैक्टिव घटक है (उदाहरण के लिए, लेआउट के बीच आगे और आगे जाने के लिए पिंच करना, संभावित रूप से संक्रमण को रद्द करना) आपके उदाहरण प्रोजेक्ट में? (मुझे एक स्पष्ट नहीं मिला) –

+0

नहीं, ऐसा नहीं है। मैं इस सप्ताह के अंत में दूसरे उदाहरण पर एक स्टैब ले सकता हूं। –

+0

जुड़ा हुआ भंडार उत्कृष्ट है। इसे बनाने और साझा करने के लिए समय निकालने के लिए धन्यवाद। – jrturton

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