6

サブビューを再利用している非常に大きな水平スクロールUIScrollViewがあります(UITableViewがセルを再利用するのと同様に、表示領域外にあるときにそれらを移動および更新します)。これは scrollViewDidScroll: delegate 呼び出しに依存しており、実際の contentOffset が得られます。ここで、特定のサブビューをいつ再利用するかを決定します。ここまでは順調ですね。

プログラムで contentOffset を変更する必要がある場合もありますが、カスタム アニメーション (慣性と最終位置への跳ね返り) を使用します。これは、コア アニメーションを使用して非常に簡単に行うことができます。

問題は、カスタム アニメーションのときに scrollViewDidScroll: デリゲート メソッドが呼び出されないことです。サブビューの再利用が機能するように、手動で行う必要があります。0.02秒ごとのタイマー発火で呼び出してみました。現在、2 つの問題があります。

  1. [[_scrollView.layer presentationLayer] bounds].origin.x を使用して UIScrollView contentOffset を取得する必要があります。これは、アニメーション中に通常の _scrollView.contentOffset が変更されないためです。

    ただし、presentationLayer からの情報は正確な同期には不十分で、少し遅れることがあります。

  2. 問題は、新しい contentOffset が現在の位置から離れている場合です。組み込みの UIScrollView アニメーションは CAKeyframeAnimation のようで、キー フレームの位置で scrollViewDidScroll を呼び出す必要があります。しかし、私はこれらを得ることができません。

    キー フレームと同期されていないタイマーに依存すると、ビューが間違った場所で再利用され、アニメーション中にまったく表示されなくなります。

setContentOffset:X animation:YES 中にUIScrollViewがscrollViewDidScrollを正確に呼び出す方法とタイミングについて、誰かが光を当てることができますか? アプリストアのルールを破らずに再現することは可能ですか?

4

1 に答える 1

4

まず第一に、私はNSTimer0.02 秒の遅延で を使用しません。これはタイマーが想定しているものではありません。を使用してみてくださいCADisplayLink。フレームごとに 1 回発火します。


コールバック メソッドで、カスタム アニメーションが実行されている場合は、独自の物理コードを実行し、それぞれ -setContentOffset:animated: を呼び出すことができます。これにより、CA では許可されない指数関数的な緩和も可能になります。

于 2012-04-18T13:01:57.167 に答える