2011-02-02 1 views
22

回転球を描く、アニメーション化されたトランスペアレントOpenGL ESサブビュー(AppleのテンプレートEAGLViewクラスの変更)があります。 Appleの例のように、CADisplayLinkは利用可能なデバイスで使用されます。UIScrollViewがiPhone上でドラッグされたときに、OpenGL ESビューのアニメーションがフリーズする

同じ画面に、選択できるUIButtonsを含むUIScrollViewがあります。ユーザーがUIScrollViewをスクロールすると、自分のEAGLViewのアニメーションがフリーズします。この動作は、iPhone 2GデバイスのiOS Simulator 4.2およびiPhone OS 3.1.3で再現されます。

EAGLViewの一時停止を防ぐために何をすべきか、私の独自のスクロールビューをコーディングすることとは別にアイデアはありますか?

+0

2016年に


例 - 。それは**それを思わcommonModes **は確かに典型的な近代的なiOSのためのソリューションです。参照してください:http://stackoverflow.com/a/4878182/294884これは5年間のQAはありませんがかなり信じられないです。 – Fattie

答えて

51

スクロール中にCADisplayLinkが起動するかどうかは、実行ループに追加するモードによって異なります。おそらく、あなたはどこか、これを持っている:

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

のUIApplicationをscrollviewがスクロールされたときに含まれる「コントロールで追跡」の実行ループモード、UITrackingRunLoopModeを追加します。その時点でrunloopはデフォルトモードから切り離され、ディスプレイリンク(デフォルトモードで追加されたタイマー、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 
    } 
+0

ありがとう!このプロジェクトでは、GUI上にテクスチャリングされた球をレンダリングしているだけなので、UIKitをブロックすることについて実際には心配していないので、GLはUIKit処理に多くの時間を費やす必要があります:-) –

+3

ちょっとした追加!これはうまくいくが、UIScrollViewがタッチアップイベントをキャッチしてスクロールモードでフリーズすることはないiOS4デバイスのバグを引き起こす。これは、iOS4 SimulatorやiOS3.1.3のiPhone2Gでは表示されません。ソリューションは非常に単純であることが判明しました。ディスプレイリンクがサポートされていても、NSTimerベースのコードパスに切り替えて、NSRunLoopCommonModesでNSTimerをスケジュールしました。 –

+1

このソリューションの詳細については、この質問を参照してください:http://stackoverflow.com/questions/5944050/cadisplaylink-opengl-rendering-breaks-uiscrollview-behaviour –

関連する問題