Why does UIScrollView pause my CADisplayLink?

浪尽此生 提交于 2019-11-30 02:00:37

问题


I have a view backed by a CAEAGLLayer, which is inside a UIScrollView. When I begin scrolling, the CADisplayLink that calls the -draw method of openGL view stops getting called.

I verified that my runloop start / stop methods don't get called when scrolling. The -draw method simply doesn't get called as soon as scrolling begins, and resumes getting called as soon as scrolling ends.

Does UIKit stop a CADisplayLink from firing as soon as scrolling starts?

The display link is added to the run loop like this:

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

Maybe there is a conflict with this run loop mode and UIScrollView? Are there other run loop modes or alternative solutions to keep a CADisplayLink firing even when a UIScrollView is scrolling?

I thought there can be more than just one CADisplayLink in any application. Is that wrong?


回答1:


You're not in NSDefaultRunLoopMode while scrolling a UIScrollView; you're in UITrackingRunLoopMode. So any timer scheduled only for the former won't fire in the latter. You can add your CADisplayLink to multiple run loop modes by calling addToRunLoop:forMode: repeatedly, or call it once with NSRunLoopCommonModes, which covers both modes.

They talked about this in detail, and other issues with integrating scroll views with GL, at WWDC 2012 in Session 223: "Enhancing User Experience with Scroll Views"; I recommend watching the video, as there's lots of other stuff in there that's likely relevant to your situation.


An example in (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
  }


来源:https://stackoverflow.com/questions/12622800/why-does-uiscrollview-pause-my-cadisplaylink

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!