UIView 3D变换最终帧位置

时间:2013-02-15 21:18:31

标签: iphone ios core-animation

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

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

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

动画的填充模式为kCAFillModeForwards,因此动画的最终值会保持不变。

此问题的解决方案是什么,即在动画后与此视图进行交互并通知视图确实可见?

3 个答案:

答案 0 :(得分:0)

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

- (void)animationDidStop:(CAAnimation *)anim finished:(BOOL)flag {
  ...
}

答案 1 :(得分:0)

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

这些方法允许您对实际视图属性进行动画处理,当动画完成时,视图位于其实际目标位置。

中心属性是移动视图的最简单方法。如果您已应用转换,则frame属性无效,但中心属性IS始终对读取和写入都有效。

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

正如另一张海报所说,你可以使用动画完成委托方法在动画结束后将视图移动到它的最终位置,但是做一些UIView动画为你做得更干净的事情做了很多繁琐的工作简单地说。

答案 2 :(得分:0)

甚至在您制作动画之前,您是否可以与视图互动? 是view.userInteractionEnabled设置为YES ??