2013-02-14 42 views
41

मैं थंबनेल के सेट के माध्यम से स्क्रॉल करने के लिए UICollectionView का उपयोग कर रहा हूं। स्क्रॉलिंग समाप्त होने के बाद, मैं वर्तमान थंबनेल का एक बड़ा हाय-रेज संस्करण प्रदर्शित करना चाहता हूं।UICollectionView: स्क्रॉलिंग बंद होने पर कैसे पता लगाना है

जब उपयोगकर्ता स्क्रॉलिंग पूरा कर लेता है तो मैं कैसे पता लगा सकता हूं? मैं didEndDisplayingCell लागू करता हूं, लेकिन यह केवल तब बताता है जब कोई विशेष सेल स्क्रॉल हो जाता है; यह मुझे तब नहीं बताता जब स्क्रॉल गति वास्तव में पूर्ण हो जाती है।

उत्तर

97
NS_CLASS_AVAILABLE_IOS(6_0) @interface UICollectionView : UIScrollView 

UICollectionViewUIScrollView का एक उपवर्ग है। इसलिए यदि आपने प्रतिनिधि को सेट किया है और UIScrollViewDelegate लागू किया है, तो आप इसे UIScrollView के समान तरीके से पहचानने में सक्षम होना चाहिए।

उदाहरण के लिए: -

- (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView; 

प्रति documentation के रूप में, उपरोक्त विधि बताना चाहिए जब स्क्रॉल दृश्य स्क्रॉल आंदोलन मंद समाप्त हो गया है।

+6

शानदार बनाने में। आप नहीं जानते कि यह कितना बुरा कोड है जो मुझे बचाता है। मैं अपने UICollectionViewFlowLayout में callInvalidateLayoutForBoundsChange कॉलबैक का उपयोग करके इसे मॉनीटर करने की कोशिश कर रहा था। क्या एक n00b है। –

+0

कृपया नीचे देखें D6mi का नोट scrollViewDidEndScrollingAnimation के बारे में। scrollViewDidEndDecelerating प्रोग्रामेटिक स्क्रॉलिंग के लिए नहीं बुलाया जाता है। – RajV

+1

दरअसल, मुझे समझ में नहीं आता कि वर्तमान उत्तर स्वीकार्य क्यों है, यह काम नहीं करता है 'स्क्रॉल व्यूडिड एंड डिस्सेरेटिंग' को कॉल नहीं किया जाता है, लेकिन डी 6 एमआई ने कहा, 'scrollViewDidEndScrollingAnimation' को – AkademiksQc

44

बस अपने आधार को कवर करने के लिए आपको इन UIScrollViewDelegate विधियों को लागू करना चाहिए। कुछ मामलों में एक मंदी नहीं हो सकती है (और scrollViewDidEndDecelerating नहीं कहा जाएगा), उदाहरण के लिए, पृष्ठ पूरी तरह से स्क्रॉल किया गया है। उन मामलों में scrollViewDidEndDragging में अपना अपडेट सही करें।

- (void)scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate 
{ 
    if (!decelerate) { 
    [self updateStuff]; 
    } 
} 

- (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView 
{ 
    [self updateStuff]; 
} 
+6

इसे साझा करने के लिए धन्यवाद! यह स्वीकार्य उत्तर बी/सी ओपी से पूछा जाना चाहिए "स्क्रॉलिंग रोक दी गई है" - बिना किसी तरीके के उपयोगकर्ता आसानी से संग्रह दृश्य को स्क्रॉल कर सकते हैं और बिना फिसलने के उंगली को छोड़ सकते हैं और 'scrollViewDidEndDecelerating' को कॉल नहीं किया जाएगा,' scrollViewDidEndDragging' करता है । इस उत्तर को पोस्ट करने के लिए धन्यवाद। –

21

एक महत्वपूर्ण तथ्य यह है यहां गौर करने योग्य

इस विधि (यानी एक पान इशारा)

- (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView; 

दूसरी ओर उपयोगकर्ता द्वारा चलाए गए स्क्रॉल पर बुलाया जाता है, यह एक सब पर बुलाया जाता है मैन्युअल रूप से (प्रोग्राम के) ("scrollRectToVisible" या "scrollToItemAtIndexPath" की तरह) शुरू की स्क्रॉल

- (void)scrollViewDidEndScrollingAnimation:(UIScrollView *)scrollView 
4

स्विफ्ट 3 संस्करण:

func scrollViewDidEndDecelerating(_ scrollView: UIScrollView) { 
    // Your code here 
} 
+0

धन्यवाद! यह अच्छा काम कर रहा है। – Raja

0

आप दिखाई indexpath उपयोग करना चाहते हैं:

- (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView 
{ 
    [self scrollingFinish]; 
} 
- (void)scrollingFinish { 


    if([self.collectionView indexPathsForVisibleSupplementaryElementsOfKind:UICollectionElementKindSectionHeader]){ 
     NSIndexPath *firstVisibleIndexPath = [[self.collectionView indexPathsForVisibleSupplementaryElementsOfKind:UICollectionElementKindSectionHeader] firstObject]; 
     [self.collectionView scrollToItemAtIndexPath:firstVisibleIndexPath atScrollPosition:UICollectionViewScrollPositionTop animated:YES]; 
     [NSObject cancelPreviousPerformRequestsWithTarget:self]; 
    } 
} 
1

स्विफ्ट 3 अभय एम और D6mi के जवाब के संस्करण:

स्क्रॉल उपयोगकर्ता के कारण होता है जब कार्रवाई

public func scrollViewDidEndDragging(_ scrollView: UIScrollView, willDecelerate decelerate: Bool) { 
    if (!decelerate) { 
     //cause by user 
     print("SCROLL scrollViewDidEndDragging") 
    } 
} 

public func scrollViewDidEndDecelerating(_ scrollView: UIScrollView) { 
    //caused by user 
    print("SCROLL scrollViewDidEndDecelerating") 
} 

जब स्क्रॉल कोड कार्रवाई के कारण होता है (प्रोग्राम के रूप में): ("scrollRectToVisible" या "scrollT की तरह oItemAtIndexPath ")

public func scrollViewDidEndScrollingAnimation(_ scrollView: UIScrollView) { 
    //caused by code 
    print("SCROLL scrollViewDidEndScrollingAnimation") 
} 

नोट्स:

  • अपने UIScrollViewDelegate या UICollectionViewDelegate प्रतिनिधि में इन कार्यों रखो।
  • यदि आप एक अलग प्रतिनिधि नहीं है, अपने वर्तमान वर्ग अपने वर्ग फ़ाइल

के UIScrollViewDelegate सेशन शीर्ष विस्तार कर सकते हैं।

open class MyClass: NSObject , UICollectionViewDelegate 

और कहीं आपके viewWillAppear वर्ग का अपना प्रतिनिधि

override open func viewWillAppear(_ animated: Bool) { 
    super.viewWillAppear(animated) 
    // ... 
    self.myScrollView.delegate = self 
    // ... 
} 

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

  • कोई संबंधित समस्या नहीं^_^