Ios 为什么UIScrollView会暂停我的CADisplayLink?
我有一个由CaeAglayer支持的视图,它位于UIScrollView中。当我开始滚动时,调用openGL视图的-draw方法的CADisplayLink停止被调用 我验证了我的runloop启动/停止方法在滚动时没有被调用。-draw方法不会在滚动开始时立即调用,而会在滚动结束时恢复调用 UIKit是否会在滚动开始时阻止CADisplayLink启动 显示链接添加到运行循环中,如下所示:Ios 为什么UIScrollView会暂停我的CADisplayLink?,ios,opengl-es,uikit,cadisplaylink,caeagllayer,Ios,Opengl Es,Uikit,Cadisplaylink,Caeagllayer,我有一个由CaeAglayer支持的视图,它位于UIScrollView中。当我开始滚动时,调用openGL视图的-draw方法的CADisplayLink停止被调用 我验证了我的runloop启动/停止方法在滚动时没有被调用。-draw方法不会在滚动开始时立即调用,而会在滚动结束时恢复调用 UIKit是否会在滚动开始时阻止CADisplayLink启动 显示链接添加到运行循环中,如下所示: [dl addToRunLoop:[NSRunLoop currentRunLoop] forMode:
[dl addToRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode];
可能与此运行循环模式和UIScrollView存在冲突?是否有其他运行循环模式或替代解决方案可以在UIScrollView滚动时保持CADisplayLink启动
我认为在任何应用程序中都可以有不止一个CADisplayLink。错了吗?滚动
UIScrollView
时,您没有处于NSDefaultRunLoopMode
;您处于uitrackingrunloop模式
。因此,任何只为前者安排的计时器都不会在后者中触发。您可以通过反复调用addToRunLoop:forMode:
将您的CADisplayLink
添加到多个运行循环模式,或者使用NSRunLoopCommonModes
调用一次,这两种模式都包括在内
他们在WWDC 2012第223次会议“使用滚动视图增强用户体验”中详细讨论了这一点,以及将滚动视图与GL集成的其他问题;我建议你看电影,因为里面有很多其他的东西可能与你的情况有关
(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
}
那我该怎么办呢?如何为多种模式安排计时器,使其在滚动时也能启动?只需两次调用-addToRunLop:forMode:?事实上,@rickster关于这个问题,几年后,现在看起来确实相当稳定<代码>.commonModes最终似乎“正常工作”。我在Swift3示例中进行了编辑,显然可以随意删除/edit1。您是否正在添加新模式当前运行循环模式?2.如果这是主线程,这是否意味着您已将新模式添加到主线程的模式中?因此,在应用程序被关闭之前,该模式不会从中删除?这基本上意味着该应用程序将进行更大规模的事件跟踪?我这样问是因为我读到“一旦一种模式被添加到公共模式集合中,它就不能被删除。”这意味着你不能删除该模式……这似乎是目前(2016年)的解决方案。。。stackoverflow.com/a/4878182/294884。。。我相信这就是里克斯特详细解释的。请注意,在这个问题上的QA是相当混乱的,因为苹果把一切都搞砸了,而且这些年来行为发生了巨大的变化。