UIScrollView滾動(dòng)的時(shí)候,定時(shí)器CADisplayLink、NSTimer 事件源不執(zhí)行?

下面代碼在UIScrollView滾動(dòng)的時(shí)候事件源不執(zhí)行(popNeedDisplay不執(zhí)行)

var displayLink:CADisplayLink? = CADisplayLink(target: self, selector: #selector(popNeedDisplay))
displayLink?.add(to: RunLoop.main, forMode: .defaultRunLoopMode)

將 defaultRunLoopMode 改成 commonModes 問題就解決了

var displayLink:CADisplayLink? = CADisplayLink(target: self, selector: #selector(popNeedDisplay))
displayLink?.add(to: RunLoop.main, forMode: . commonModes)


原因:
每個(gè)run loop可運(yùn)行在不同的模式下,一個(gè)run loop mode是一個(gè)集合,其中包含其監(jiān)聽的若干輸入事件源,定時(shí)器,以及在事件發(fā)生時(shí)需要通知的run loop observers。
運(yùn)行在一種某一種mode下的runloop只會(huì)處理其run loop mode中包含的輸入源事件,定時(shí)器事件,以及通知run loop mode中包含的observers。

以下是常用的mode:
// NSDefaultRunLoopMode:一般情況下應(yīng)使用此模式
// UITrackingRunLoopMode: 界面跟蹤 Mode,用于 ScrollView 追蹤觸摸滑動(dòng),保證界面滑動(dòng)時(shí)不受其他 Mode 影響
// NSRunLoopCommonModes:包含default modes,modal modes,event Tracking modes

由此可見,當(dāng)UIScrollView滾動(dòng)的時(shí)候,處于UITrackingRunLoopMode下,而我們?cè)O(shè)置定時(shí)器加入到了NSDefaultRunLoopMode下,所以事件源不會(huì)被調(diào)用,而 NSRunLoopCommonModes 包含 UITrackingRunLoopMode 和 NSDefaultRunLoopMode,所以我們直接使用NSRunLoopCommonModes就可以解決了!



強(qiáng)烈推薦:超簡(jiǎn)單?。?! iOS設(shè)置狀態(tài)欄、導(dǎo)航欄按鈕、標(biāo)題、顏色、透明度,偏移等

https://github.com/wangrui460/WRNavigationBar
https://github.com/wangrui460/WRNavigationBar_swift



歡迎關(guān)注我的微博:wangrui460

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容