16

UIScrollView 内にある CAEAGLLayer に基づくビューがあります。スクロールを開始すると、openGL ビューの -draw メソッドを呼び出す CADisplayLink が呼び出されなくなります。

スクロール時に runloop の start / stop メソッドが呼び出されないことを確認しました。-draw メソッドは、スクロールが開始されるとすぐには呼び出されず、スクロールが終了するとすぐに呼び出されます。

UIKit は、スクロールが開始されるとすぐに CADisplayLink の起動を停止しますか?

表示リンクは、次のように実行ループに追加されます。

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

この実行ループ モードと UIScrollView が競合している可能性がありますか? UIScrollView がスクロールしている場合でも CADisplayLink を起動し続ける他の実行ループ モードまたは代替ソリューションはありますか?

どのアプリケーションにも複数の CADisplayLink が存在する可能性があると考えました。それは間違っていますか?

4

1 に答える 1

32

;NSDefaultRunLoopModeをスクロールしている間は参加していません。UIScrollViewあなたはにいますUITrackingRunLoopMode。したがって、前者のみにスケジュールされたタイマーは、後者では起動しません。CADisplayLinkを繰り返し呼び出すことで複数の実行ループモードに追加することも、両方のモードをカバーaddToRunLoop:forMode:するで1回呼び出すこともできます。NSRunLoopCommonModes

彼らは、セッション223のWWDC 2012で、これと、スクロールビューと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 に答える