16

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

我验证了滚动时不会调用我的 runloop 启动/停止方法。-draw 方法根本不会在滚动开始时立即被调用,而是在滚动结束时继续被调用。

UIKit 是否会在滚动开始后立即停止 CADisplayLink 触发?

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

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

可能这个run loop模式和UIScrollView有冲突?即使 UIScrollView 正在滚动,是否还有其他运行循环模式或替代解决方案来保持 CADisplayLink 触发?

我认为任何应用程序中都可以有不止一个 CADisplayLink。那是错的吗?

4

1 回答 1

32

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

他们在 WWDC 2012 的 Session 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
  }
于 2012-09-27T15:58:21.993 回答