我有两个视图:A 和 B。A 位于屏幕顶部,B 位于屏幕底部。
当用户按下按钮时,视图 B 会以 EaseInEaseOut 贝塞尔曲线向上动画,直到到达 y = 0。当 B 正在前往目的地的途中,它应该在碰到 A 时将 A 向上推。换句话说,当 B 有在从底部到顶部的过渡过程中通过了某个 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 )。然而,结果并不正确。
关于下一步我可以尝试什么的任何建议?