UIView三维变换最终帧位置



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

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

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

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

这个问题的解决方案是什么,即在动画之后与该视图交互,并通知该视图它确实可见?

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

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

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

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

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

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

正如另一位海报所说,动画结束后,您可以使用动画完成代理方法将视图移动到其最终位置,但要做UIView动画为您做的更干净、更简单的事情,需要做很多繁琐的工作。

即使在设置视图动画之前,您也能与视图交互吗?视图.userInteractionEnabled是否设置为YES??

最新更新