下面代码在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