ios - 为什么 UIScrollView 会暂停我的 CADisplayLink?

标签 ios opengl-es uikit cadisplaylink caeagllayer

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

我确认我的 runloop 启动/停止方法在滚动时不会被调用。 -draw 方法不会在滚动开始时立即调用,而是在滚动结束后立即恢复调用。

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

显示链接是这样添加到run loop中的:

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

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

我认为在任何应用程序中可以有不止一个 CADisplayLink。错了吗?

最佳答案

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

他们在 WWDC 2012 的第 223 场 session 上详细讨论了这一点,以及将 ScrollView 与 GL 集成的其他问题:“使用 ScrollView 增强用户体验”;我建议观看 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
  }

关于ios - 为什么 UIScrollView 会暂停我的 CADisplayLink?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12622800/

相关文章:

ios - 生成用于设置 Apple 推送通知的 .pem 文件

ios - 具有滚动功能的大量文本的 UIAlertController?

android - 设备特定的 OpenGL ES 实现函数

javascript - WebGL中GLMAT_ARRAY_TYPE()的作用是什么?

ios - 如果将两个 UITableView 添加为屏幕上的 subview ,则导航栏仅会折叠一个 UITableView

ios - SwiftUI - 表单中的 NavigationLink 单元格在详细信息弹出后保持突出显示

ios - Xcode:什么是简单语言的目标和方案?

ios - UITest iOS waitForExistence 返回 false 但元素可见

opengl-es - 如何使用 OpenGL ES 1 绘制虚线?

ios - MKPlacemark 图钉标题