Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/114.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 为什么UIScrollView会暂停我的CADisplayLink?_Ios_Opengl Es_Uikit_Cadisplaylink_Caeagllayer - Fatal编程技术网

Ios 为什么UIScrollView会暂停我的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:

我有一个由CaeAglayer支持的视图,它位于UIScrollView中。当我开始滚动时,调用openGL视图的-draw方法的CADisplayLink停止被调用

我验证了我的runloop启动/停止方法在滚动时没有被调用。-draw方法不会在滚动开始时立即调用,而会在滚动结束时恢复调用

UIKit是否会在滚动开始时阻止CADisplayLink启动

显示链接添加到运行循环中,如下所示:

[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是相当混乱的,因为苹果把一切都搞砸了,而且这些年来行为发生了巨大的变化。