サブビューを再利用している非常に大きな水平スクロールUIScrollViewがあります(UITableViewがセルを再利用するのと同様に、表示領域外にあるときにそれらを移動および更新します)。これは scrollViewDidScroll: delegate 呼び出しに依存しており、実際の contentOffset が得られます。ここで、特定のサブビューをいつ再利用するかを決定します。ここまでは順調ですね。
プログラムで contentOffset を変更する必要がある場合もありますが、カスタム アニメーション (慣性と最終位置への跳ね返り) を使用します。これは、コア アニメーションを使用して非常に簡単に行うことができます。
問題は、カスタム アニメーションのときに scrollViewDidScroll: デリゲート メソッドが呼び出されないことです。サブビューの再利用が機能するように、手動で行う必要があります。0.02秒ごとのタイマー発火で呼び出してみました。現在、2 つの問題があります。
[[_scrollView.layer presentationLayer] bounds].origin.x を使用して UIScrollView contentOffset を取得する必要があります。これは、アニメーション中に通常の _scrollView.contentOffset が変更されないためです。
ただし、presentationLayer からの情報は正確な同期には不十分で、少し遅れることがあります。
問題は、新しい contentOffset が現在の位置から離れている場合です。組み込みの UIScrollView アニメーションは CAKeyframeAnimation のようで、キー フレームの位置で scrollViewDidScroll を呼び出す必要があります。しかし、私はこれらを得ることができません。
キー フレームと同期されていないタイマーに依存すると、ビューが間違った場所で再利用され、アニメーション中にまったく表示されなくなります。
setContentOffset:X animation:YES 中にUIScrollViewがscrollViewDidScrollを正確に呼び出す方法とタイミングについて、誰かが光を当てることができますか? アプリストアのルールを破らずに再現することは可能ですか?