चाहे CADisplayLink
स्क्रॉल के दौरान आग लगती है उस मोड पर निर्भर करता है जिसके साथ आप इसे रन लूप में जोड़ते हैं। शायद आप इस किया है, कहीं न कहीं:
[displayLink addToRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode];
UIApplication 'नियंत्रण में ट्रैकिंग' है, जो भी शामिल है जब एक scrollview स्क्रॉल है के लिए, एक रन पाश मोड, UITrackingRunLoopMode
कहते हैं। तो उस समय रनलोप को डिफ़ॉल्ट मोड से बाहर कर दिया जाता है और इसलिए आपका डिस्प्ले लिंक (और डिफ़ॉल्ट टाइम्स में जोड़ा गया कोई भी टाइमर, NSURLConnections
, आदि) डिफ़ॉल्ट मोड को पुनर्स्थापित किए जाने तक आग में विफल हो जाएगा।
त्वरित सुधार: करने के लिए अपने कोड बदलने के लिए:
[displayLink addToRunLoop:[NSRunLoop currentRunLoop] forMode:NSRunLoopCommonModes];
UITrackingRunLoopMode आम विधियों में से एक माना जाता है।
UIKit में बाधा डालने में बहुत अधिक समय खर्च करने से कुछ बहुत ही खराब नियंत्रण प्रतिक्रिया हो सकती है, इसलिए आपको सावधान रहना होगा। यह बड़े पैमाने पर विषय से अलग हो जाएगा, लेकिन हालांकि ओपनजीएल मोडल है और इसलिए विशेष रूप से थ्रेडिंग अनुकूल नहीं है, तो आप एक अलग थ्रेड पर प्रतिपादन करने के लिए एक ईएजीएलशेयर समूह का उपयोग कर सकते हैं और फिर इसे मुख्य थ्रेड पर दबा सकते हैं।
में (2016) Swift3 एक उदाहरण ...
let d = CADisplayLink(target: self, selector: #selector(ThisClassName.updateAlpha))
d.add(to: RunLoop.current, forMode: RunLoopMode.commonModes)
//and then, for example...
func updateAlpha() {
let a = leader.layer.presentation()?.value(forKey: "opacity") as! CGFloat
follower.alpha = a
}
2016 - ऐसा नहीं है कि प्रतीत होता है ** commonModes ** वास्तव में विशिष्ट आधुनिक iOS के लिए समाधान है।। देखें: http://stackoverflow.com/a/4878182/294884 यह काफी अविश्वसनीय है कि इस पर पांच साल तक कोई क्यूए नहीं रहा है। – Fattie