2009-03-03 12 views
70

जबकि UIScrollView (या इसके व्युत्पन्न वर्ग) स्क्रॉलिंग हो रहा है, ऐसा लगता है कि स्क्रॉल समाप्त होने तक सभी NSTimers चलने लगते हैं।UIScrollView स्क्रॉलिंग समाप्त होने तक NSTimer को रोकता है

क्या इसके आसपास जाने का कोई तरीका है? धागे? एक प्राथमिकता सेटिंग? कुछ भी?

+1

को स्वीकार [काशिफ] (http://stackoverflow.com/users/211439/kashif-hisam) के [जवाब] (http पर विचार किसी के लिए: // stackoverflow.com/a/2742275/865175)! –

+0

संभावित डुप्लिकेट [UIScrollView क्यों मेरे CADisplayLink को रोकता है?] (Http://stackoverflow.com/questions/12622800/why-does-uiscrollview-pause-my-cadisplaylink) – Fattie

+0

सात साल बाद ... http: // stackoverflow .com/a/12625429/2 9 4884 – Fattie

उत्तर

183

एक आसान & लागू करने के लिए सरल समाधान करना है:

NSTimer *timer = [NSTimer timerWithTimeInterval:... 
             target:... 
             selector:.... 
             userInfo:... 
             repeats:...]; 
[[NSRunLoop mainRunLoop] addTimer:timer forMode:NSRunLoopCommonModes]; 
+8

है, मैं पुष्टि कर सकता हूं कि यह विधि काम करती है। – Tyler

+1

UITrackingRunLoopMode मोड है - और इसका सार्वजनिक - आप विभिन्न टाइमर व्यवहार बनाने के लिए उपयोग कर सकते हैं। –

+0

इसे प्यार करें, जीएलकेवी कंट्रोलर के साथ एक आकर्षण की तरह काम करता है। UIScrollView प्रकट होने पर वर्णित नियंत्रक को बस सेट करें और वर्णित अनुसार अपना स्वयं का टाइमर शुरू करें। स्क्रॉलव्यू खारिज होने पर इसे उलट दें और यह है! मेरा अपडेट/रेंडर लूप बहुत महंगा नहीं है, जिससे मदद मिल सकती है। –

5

यदि आप स्क्रॉल करते समय टाइमर आग लगाना चाहते हैं तो आपको एक और थ्रेड और एक और रन लूप चलाने होंगे; चूंकि टाइमर को इवेंट लूप के हिस्से के रूप में संसाधित किया जाता है, यदि आप अपने दृश्य को स्क्रॉल करने में व्यस्त हैं, तो आप कभी भी टाइमर तक नहीं पहुंचते हैं। हालांकि अन्य धागे पर चलने वाले टाइमर के पेर्फ/बैटरी जुर्माना इस मामले को संभालने के लायक नहीं हो सकता है।

+10

इसे किसी अन्य धागे की आवश्यकता नहीं है, अधिक हालिया [उत्तर] देखें (http://stackoverflow.com/questions/605027/uiscrollview-pauses-nstimer-until-scrolling-finishes/2742275 # 2742275) काशीफ से। मैंने कोशिश की और यह आवश्यक अतिरिक्त थ्रेड के साथ काम करता है। – progrmr

+3

किसी अन्य धागे की आवश्यकता नहीं है। काशीफ का जवाब बहुत बेहतर है। – stigi

+1

मैंने इसे एक उथल-पुथल –

8

हां, पॉल सही है, यह एक रन लूप मुद्दा है। विशेष रूप से, आप NSRunLoop पद्धति के उपयोग करने की जरूरत है:

- (void)addTimer:(NSTimer *)aTimer forMode:(NSString *)mode 
7

यह तेज संस्करण है।

timer = NSTimer.scheduledTimerWithTimeInterval(0.01, target: self, selector: aSelector, userInfo: nil, repeats: true) 
      NSRunLoop.mainRunLoop().addTimer(timer, forMode: NSRunLoopCommonModes) 
16

स्विफ्ट 3 का उपयोग

timer = Timer.scheduledTimer(timeInterval: 0.1, 
          target: self, 
          selector: aSelector, 
          userInfo: nil, 
          repeats: true) 


RunLoop.main.add(timer, forMode: RunLoopMode.commonModes) 
+0

धन्यवाद आप बहुत कुछ:) – IOSDev

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