Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/iphone/37.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/27.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
Iphone 当UIScrollView滚动时,CADisplayLink停止更新_Iphone_Objective C_Cocoa Touch_Core Animation - Fatal编程技术网

Iphone 当UIScrollView滚动时,CADisplayLink停止更新

Iphone 当UIScrollView滚动时,CADisplayLink停止更新,iphone,objective-c,cocoa-touch,core-animation,Iphone,Objective C,Cocoa Touch,Core Animation,这个标题是不言自明的,但我有一些动画是在由CADisplayLink触发的循环中完成的。但是,当我滚动添加到视图层次结构中的UIScrollView时,动画立即停止,只有在滚动完全停止并停止时,动画才会再次返回 是否仍要取消此行为?在另一个线程和另一个运行循环上运行显示链接(使用-addtorunlop:forMode:)。因此,请创建一个新线程,在该线程上创建一个运行循环,并在该线程/运行循环上运行CADisplayLink。您还可以通过使用NSRunLoopCommonModes而不是NSD

这个标题是不言自明的,但我有一些动画是在由CADisplayLink触发的循环中完成的。但是,当我滚动添加到视图层次结构中的UIScrollView时,动画立即停止,只有在滚动完全停止并停止时,动画才会再次返回


是否仍要取消此行为?

在另一个线程和另一个运行循环上运行显示链接(使用
-addtorunlop:forMode:
)。因此,请创建一个新线程,在该线程上创建一个运行循环,并在该线程/运行循环上运行CADisplayLink。

您还可以通过使用
NSRunLoopCommonModes
而不是
NSDefaultRunLoopModes
来减轻此问题的影响:

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

nsrunlopCommonModes似乎破坏了uiscrollview的弹性和连续性。

我发现,如果将帧间隔设置为2而不是1(每秒30帧),则一切正常。所以我要做的是,当我的popover出现时将其设置为2,当它消失时将其重置为1。

使用。它是专门为滚动资料而设计的

否则,只需在
-scrollViewDidScroll
处调用render&present例程即可


在这里,您可以找到更好(更复杂)的解决方案:

这允许您使用“nsrunlopCommonModes”,并避免在不滚动的情况下握住手指时OpenGL冻结


这与Doug的发现有关(将CADisplayLink的帧间隔设置为2,而不是1修复UIScrollView)。

我们通过将
帧间隔从1更改为2修复了相同的问题。这实际上是OpenGL场景渲染速率的一半,但它仍然可以充分渲染以满足您的需要

帧间隔 显示前必须经过的帧数 链接再次通知目标

@属性(非原子)NSInteger帧间隔讨论默认值 值为1,这将导致应用程序在 显示器的刷新率。如果该值设置为更大的值 如果大于1,则显示链接将以很小的速度通知应用程序 本机刷新率。例如,将间隔设置为2个原因 显示链接每隔一帧触发一次,提供一半的帧 比率

将此值设置为小于1将导致未定义的行为,并且 程序员的错误


实际上,CADisplayLink支持多个RunloopMode。 试试这个:

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

有人应该编辑这个问题:这个类是CADisplayLink,而不是UIDisplayLink.2016——看起来是这样。commonModes确实是典型现代iOS的解决方案。请参阅:stackoverflow.com/a/4878182/294884令人难以置信的是,五年来,在这个问题上一直没有QA。这阻止了UIScrollView在渲染过程中接收运行循环调用,最后,在任何时候都停止滚动。这在今天看来确实有效。Eonil描述的问题似乎已经被苹果解决了。真是一场惨败,苹果。这仍然解决了meThis的问题。这只是减少了UIScrollView的停止,无法消除。2016年:现在,这实际上是错误的。stackoverflow.com/a/4878182/294884这究竟是如何解决错误的?问题似乎是动画停止了。将帧速率减半如何使其再次运行?这似乎是0/2=0的情况。@OldPeculier由于显示链接将每隔一帧触发一次,因此我们可以将CPU时间用于其他系统任务,例如渲染滚动视图。试试看。你是说CADisplayLink没有启动它的回调,因为CPU过载了,而通过将回调次数减半,可以减轻CPU负载,从而执行回调。我发现…令人惊讶。记录在案,在2016年,我们测试的所有设备上都无法实现这一点。这似乎是一个解决方案:stackoverflow.com/a/4878182/294884