我试图通过使其从屏幕中心出现同时增长到其完整尺寸来呈现视图,同时以 3D 方式围绕 x 轴旋转它。当我创建视图时,我对其应用变换以确保它收缩并旋转以开始(它太小,实际上不可见),然后我尝试使用 CATransform3D,如下所示:
CABasicAnimation *anim = [CABasicAnimation animationWithKeyPath:@"transform"];
CATransform3D transform = CATransform3DRotate(view.layer.transform, M_PI, 1.0, 0, 0);
transform = CATransform3DScale(transform, 1000, 1000, 1000);
transform.m34 = 1.0 / 10000;
[anim setToValue:[NSValue valueWithCATransform3D:transform]];
[anim setDuration:0.75f];
anim.removedOnCompletion = NO;
anim.delegate = self;
[view.layer addAnimation:anim forKey:@"grow"];
然而这个动画并没有改变图层的实际变换,所以我也这样做:
- (void)animationDidStop:(CAAnimation *)theAnimation finished:(BOOL)flag {
view.layer.transform = CATransform3DIdentity;
[view.layer removeAllAnimations];
}
设置动画停止后的变换。然而,这有时会导致动画结束时出现明显的闪烁。我相信这是因为动画在动画阶段结束时将原始变换放回原处,并且这种情况在调用animationDidStop 例程之前发生。有一个更好的方法吗?
编辑:将其合并到 UIView 动画中,这样您就可以直接设置变换:
view.layer.transform = CATransform3DScale(CATransform3DIdentity, 0.001, 0.001, 0.001);
view.layer.transform = CATransform3DRotate(view.layer.transform, M_PI, 1.0, 0.0, 0.0);
[UIView beginAnimations:nil context:NULL];
[UIView setAnimationDuration:0.75];
[UIView setAnimationCurve:UIViewAnimationCurveEaseOut];
CATransform3D transform = CATransform3DRotate(view.layer.transform, M_PI, 1.0, 0, 0);
transform = CATransform3DScale(rotationTransform, 1000, 1000, 1000);
transform.m34 = 1.0 / -500;
view.layer.transform = transform;
[UIView commitAnimations];
但是,我仍然想知道我最初的查询的答案,即如何使用 CAAnimation 成功实现相同的目标,因为这通常为动画提供了更大的灵活性。
Edit2:看来我原来的问题(如何解决 CAAnimation 的问题)的答案实际上非常简单。为了保持最终状态(并消除闪烁),我只需要添加以下行:
anim.fillMode = kCAFillModeForwards;