UIScrollView滚动的时候,定时器CADisplayLink、NSTimer 事件源不执行?

下面代码在UIScrollView滚动的时候事件源不执行(popNeedDisplay不执行)

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)


原因:
每个run loop可运行在不同的模式下,一个run loop mode是一个集合,其中包含其监听的若干输入事件源定时器,以及在事件发生时需要通知的run loop observers
运行在一种某一种mode下的runloop只会处理其run loop mode中包含的输入源事件,定时器事件,以及通知run loop mode中包含的observers。

以下是常用的mode:
// NSDefaultRunLoopMode:一般情况下应使用此模式
// UITrackingRunLoopMode: 界面跟踪 Mode,用于 ScrollView 追踪触摸滑动,保证界面滑动时不受其他 Mode 影响
// NSRunLoopCommonModes:包含default modes,modal modes,event Tracking modes

由此可见,当UIScrollView滚动的时候,处于UITrackingRunLoopMode下,而我们设置定时器加入到了NSDefaultRunLoopMode下,所以事件源不会被调用,而 NSRunLoopCommonModes 包含 UITrackingRunLoopMode 和 NSDefaultRunLoopMode,所以我们直接使用NSRunLoopCommonModes就可以解决了!



强烈推荐:超简单!!! iOS设置状态栏、导航栏按钮、标题、颜色、透明度,偏移等

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



欢迎关注我的微博:wangrui460

你可能感兴趣的:(UIScrollView滚动的时候,定时器CADisplayLink、NSTimer 事件源不执行?)