2012-12-10 32 views
11

स्क्रॉल कर रहा है या नहीं, मैं यह पता लगाने के लिए देख रहा हूं कि UIScrollView स्क्रॉलिंग है या नहीं।पता लगाएं कि UIScrollView

अर्थात

BOOL isScrolling = myscrollview.scrolling; 

मैं इस को लागू करने के बारे में कैसे जाना होगा? .dragging और .decelerating लागू नहीं होते हैं जब setContentOffset:animated: का उपयोग किया जाता है।

+0

कैसे के बारे में 'scrollViewDidScroll' प्रतिनिधि विधि? – iDev

+0

जो केवल "कब" का उत्तर देता है। – Jonny

+1

थोड़ा उलझन में, लेकिन इस जानकारी के आधार पर कि आप यह जानकारी क्यों चाहते हैं, आप मुख्य रन लूप के मोड को देख सकते हैं। उदाहरण के लिए, वर्तमान में कोई स्क्रॉल व्यू स्क्रॉल नहीं हो रहा है या ड्रैग किया जा रहा है, तो आपका मुख्य रन लूप शायद 'NSDefaultRunLoopMode' में होगा। यदि कोई स्क्रॉल व्यू स्क्रॉलिंग/ड्रैग किया जा रहा है, तो यह 'NSRunLoopCommonModes' का हिस्सा, एक अलग मोड में होगा। उदाहरण के लिए, यदि आप कुछ करने के लिए स्क्रॉलिंग के लिए प्रतीक्षा करना चाहते हैं, तो आप 'CFRunLoopPerformBlock (CFRunLoopGetMain(), केसीएफआरन लूप डीफॉल्टमोड, ब्लॉक) का उपयोग कर सकते हैं; ' – Guillaume

उत्तर

6

मैं आमतौर पर scrollViewWillBeginDragging: और scrollViewDidEndDragging:willDecelerate: ईवेंट में बूलियन चर सेट करके ऐसा करता हूं।

UIScrollView Docs

+0

मैं ड्रैगिंग का उपयोग नहीं कर रहा हूं ...भले ही मुझे लगता है कि यह अभी भी सेट नहीं होगा, कॉन्टेंटऑफसेट: एनिमेटेड – Jonny

+1

आप 'scrollViewDidEndScrollingAnimation:' को भी कार्यान्वित कर सकते हैं, जिसे 'setContentOffset: एनिमेटेड:' समाप्त द्वारा एनीमेशन लॉन्च किया जाएगा ... – Guillaume

+0

@Guillaume: मैंने इसका परीक्षण किया और यदि आप एनीमेशन का उपयोग करते हैं तो यह काम करता है। क्या आप ऐसी संपत्ति का उपयोग करते हैं जो उसी समय सेट है जिसे आप 'setContentOffset' कहते हैं? या स्क्रॉलिंग शुरू होने पर जांचने की एक और संभावना है? क्या एनीमेशन का उपयोग किए बिना भी संभावना है? – testing

12

यह बात करने का एक थोड़ा कुशल तरीका हो सकता है, लेकिन मैं अपने कोड में यह उपयोग किया है से पहले और वह अभी तक मुझे विफल रहा है नहीं किया है। :)

#import <QuartzCore/QuartzCore.h> 
--- 
BOOL isScrolling = [scrollView.layer animationForKey:@"bounds"] != nil; 

'self.contentOffset' एक UIScrollView की भरपाई करने के लिए इसके अलावा UIView की "bounds.origin" संपत्ति में संग्रहित है के रूप में अच्छी तरह से (मुझे लगता है के बाद से यह थोड़ा निचले स्तर में अधिक सुविधाजनक है कोड)। जब आप [setContentOffset: एनिमेटेड:] को कॉल करते हैं, तो यह UIScrollView को CABasicAnimation के रूप में पास कर रहा है, जो "सीमाएं" संपत्ति में हेरफेर कर रहा है।

अनुमोदित, स्क्रॉल का आकार स्वयं एनिमेटिंग होने पर यह चेक भी सही होगा। इस मामले में आपको वास्तव में एनीमेशन ([CAAnimation toValue] से सीमाओं को खींचने की आवश्यकता हो सकती है) और मैन्युअल तुलना करने के लिए तुलना करें कि "मूल" स्वयं बिल्कुल बदल रहा है या नहीं।

यह सबसे सुरुचिपूर्ण समाधान नहीं है, लेकिन मुझे जहां भी संभव हो प्रतिनिधि का उपयोग करने से बचने में सक्षम होना पसंद है। विशेष रूप से यदि प्रश्न में वर्ग एक UIScrollView उपclass है। :)

+0

उस उत्तर के लिए धन्यवाद टीआईएम, क्या आपको पता है कि यह ऐप्पल की समीक्षा प्रक्रिया को पास करता है या नहीं? – Randy

+1

कोई चिंता नहीं रैंडी! हां! ऐसा होता है। यह किसी भी निजी एपीआई को छू नहीं रहा है। मेरे पास 2 साल से अधिक के लिए ऐप स्टोर में कोड की इस पंक्ति के साथ एक ऐप है। :) – TiM

0
- (void)scrollViewDidEndScrollingAnimation:(UIScrollView *)scrollView; 

वर्तमान स्क्रॉल स्थिति को सहेजने के लिए ध्वज का उपयोग करें? यह केवल सेटकंटेंट ऑफसेट को हल कर सकता है: एनिमेटेड: समस्या।

"स्क्रॉलिंग" सिर्फ एक प्रभाव है, ऐसे कई तरीके हैं जो स्क्रॉलव्यू "स्क्रॉलिंग" बनाते हैं, उदा। सामग्री को लगातार ऑफसेट सेट करें। तो इस सवाल के लिए कोई जवाब नहीं होना चाहिए।

1
नहीं

एक बहुत साफ समाधान .. लेकिन सबसे विश्वसनीय होना चाहिए:

var isScrolling = false 

func scrollViewWillBeginDragging(_ scrollView: UIScrollView) { 
    isScrolling = true 
} 

func scrollViewDidEndDragging(_ scrollView: UIScrollView, willDecelerate decelerate: Bool) { 
    if !decelerate { scrollViewDidEndScrolling(scrollView) } 
} 

func scrollViewDidEndDecelerating(_ scrollView: UIScrollView) { 
    scrollViewDidEndScrolling(scrollView) 
} 

func scrollViewDidEndScrollingAnimation(_ scrollView: UIScrollView) { 
    scrollViewDidEndScrolling(scrollView) 
} 

func scrollViewDidEndScrolling(_ scrollView: UIScrollView) { 
    isScrolling = false 
} 
संबंधित मुद्दे