gpt4 book ai didi

iphone - 在 iPhone 上拖动 UIScrollView 时,OpenGL ES View 中的动画卡住

转载 作者:行者123 更新时间:2023-12-03 18:18:03 24 4
gpt4 key购买 nike

我有一个动画透明 OpenGL ES subview (Apple 模板 EAGLView 类的修改),它绘制一个旋转球体。就像 Apple 的示例一样,CADisplayLink 用于可用的设备。

在同一屏幕上,有一个 UIScrollView,其中包含可以选择的 UIButtons。当用户滚动 UIScrollView 时,我的 EAGLView 的动画卡住。此行为在 iOS Simulator 4.2 和 iPhone 2G 设备上的 iPhone OS 3.1.3 上重现。

除了编写我自己的 ScrollView 之外,还有什么想法可以防止 EAGLView 暂停?

最佳答案

CADisplayLink 在滚动期间是否触发取决于您将其添加到运行循环的模式。也许你在某个地方有这个:

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

UIApplication 添加了一个运行循环模式,UITrackingRunLoopMode,用于“跟踪控件”,其中包括 ScrollView 何时滚动。因此,此时运行循环将退出默认模式,因此您的显示链接(以及在默认模式中添加的任何计时器、NSURLConnections 等)将无法触发,直到恢复默认模式.

快速修复:将代码更改为:

[displayLink addToRunLoop:[NSRunLoop currentRunLoop] forMode:NSRunLoopCommonModes];

UITrackingRunLoopMode 被认为是常见模式之一。

花费太多时间中断 UIKit 可能会导致一些非常差的控制响应能力,因此您需要小心。这与主题有很大的分歧,但尽管 OpenGL 是模态的,因此对线程不是特别友好,但您可以使用 EAGLSharegroup 在单独的线程上进行渲染,然后将其推送到主线程上。

<小时/>

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

关于iphone - 在 iPhone 上拖动 UIScrollView 时,OpenGL ES View 中的动画卡住,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4876488/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com