AとBの2つのビューがあります。Aは画面の上部に配置され、Bは画面の下部に配置されます。
ユーザーがボタンを押すと、ビューBはy = 0に達するまで、EaseInEaseOutベジェ曲線で上向きにアニメーション化します。Bが目的地に向かう途中で、Aに当たったときにAを押し上げる必要があります。下から上への遷移中に特定のy座標(Aのy原点+高さ)を通過した場合、AはBに固執する必要があるため、BがAを上に押しているように見えます。
私がこれまでに試したこと:
- ユーザーがボタンを押した直後に、ターゲット+セレクターをCADisplayLinkに登録します。このセレクター内で、presentationLayerにアクセスしてビューBのy座標を要求し、それに応じてAのy座標を調整します。ただし、この方法は十分に正確ではないことが判明しました。presentationLayerのフレームが画面上のBの現在の位置より遅れています(これはおそらく、-presentationLayerが現在の時間のアニメーションビューの位置を再計算するためです。これには1フレームより長くかかります) 。Bのアニメーションの長さを増やすと、この方法はうまく機能します。
- ユーザーがボタンを押した直後に、ターゲット+セレクターをCADisplayLinkに登録します。このセレクター内で、x =経過時間/アニメーション期間(商の移動距離/合計距離を返す必要があります)のベジェ方程式を解くことにより、Bの現在のy座標を計算します。これには、AppleのオープンソースUnitBezier.h(http://opensource.apple.com/source/WebCore/WebCore-955.66/platform/graphics/UnitBezier.h)を使用しました。ただし、結果は正しくありません。
次に何を試すことができるかについての提案はありますか?