为什么UIScrollView会暂停我的CADisplayLink?

时间:2012-09-27 13:40:52

标签: ios opengl-es uikit cadisplaylink caeagllayer

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

我验证了滚动时不会调用我的runloop启动/停止方法。滚动开始后,-draw方法就不会被调用,只要滚动结束就会立即调用。

滚动开始后,UIKit是否会停止触发CADisplayLink?

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

[dl addToRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode];

可能与此运行循环模式和UIScrollView存在冲突?是否有其他运行循环模式或替代解决方案,即使在UIScrollView滚动时也能保持CADisplayLink触发?

我认为在任何应用程序中都不只有一个CADisplayLink。这是错的吗?

1 个答案:

答案 0 :(得分:26)

滚动NSDefaultRunLoopMode时,您不在UIScrollView;你在UITrackingRunLoopMode。因此,只为前者安排的任何计时器都不会在后者中触发。您可以通过重复调用CADisplayLinkaddToRunLoop:forMode:添加到多个运行循环模式,或者使用涵盖这两种模式的NSRunLoopCommonModes调用一次。

他们详细讨论了这个问题,以及在第123届会议的WWDC 2012“使用滚动视图增强用户体验”中将滚动视图与GL集成的其他问题;我建议观看video,因为那里有很多其他东西可能与你的情况有关。


(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
  }