0

我有一个 UIView,它有一个 X 原点,使它离开屏幕右侧。然后,我用 CATransform3D 做一个关键帧动画:

[NSValue valueWithCATransform3D:CATransform3DMakeTranslation(-view.width, 0, 0)]

问题是,动画完成后,视图的框架在视觉上处于正确的位置,但它仍然认为它不在屏幕上,所以我无法与之交互。记录它的 frame 属性也表明它在屏幕外,但从视觉上看,它不是。

动画的填充模式是kCAFillModeForwards,所以动画的最终值会保持不变。

这个问题的解决方法是什么,即在动画结束后与这个view交互,通知view它确实可见?

4

3 回答 3

0

更好的答案是使用 UIView 动画方法,如 animateWithDuration:animations:completion: (以及该方法的变体。)

这些方法让您可以在实际视图属性上制作动画,当动画完成时,视图位于其实际目标位置。

center 属性是移动视图的最简单方法。如果您应用了变换,则 frame 属性无效,但 center 属性对于读取和写入始终有效。

Core Animation 只会产生视图移动的错觉。动画发生在层树的仅显示副本上。您可以通过从图层的presentationLayer 中读取相同的属性来查询动画图层的属性。但是,视图对象不会在其明显位置响应用户交互。这些观点仍然认为它们在原来的位置。

正如另一张海报所说,一旦动画结束,您可以使用动画完成委托方法将视图移动到它的最终位置,但是要让 UIView 动画更简洁、更简单地为您做一些事情,这是很多繁琐的工作。

于 2013-02-16T02:34:19.983 回答
0

您甚至可以在动画之前与视图进行交互吗?view.userInteractionEnabled 是否设置为 YES?

于 2013-02-16T04:18:55.543 回答
0

-animationDidStop:finished:动画完成后,您可以使用 CAAnimation 委托方法来修复它:

- (void)animationDidStop:(CAAnimation *)anim finished:(BOOL)flag {
  ...
}
于 2013-02-16T01:52:12.017 回答