在屏幕右侧旋转UIView

时间:2013-12-12 20:38:56

标签: ios objective-c catransform3d

我想围绕屏幕右边缘旋转视图,就像开门一样。这就是我到目前为止所做的:

CATransform3D transform = CATransform3DIdentity;
transform.m34 = -1.0f/500;
view.layer.transform = CATransform3DRotate(transform, kDegreesToRadians(90), 0, 1, 0);
[UIView animateWithDuration:2.0f animations:^{
     view.layer.transform = transform;
} completion:nil];

我还没有完全掌握CATranforms或矩阵,所以如果有人能把我推向正确的方向,那就非常感激了!

2 个答案:

答案 0 :(得分:2)

UIView动画用于动画视图的属性,而不是动画图层的动画。据我所知,您不能使用UIView animateWithDuration:call来为视图的图层设置动画。

您需要创建一个CABasicAnimation并将其自己添加到视图层。

自从我完成CAAnimations以来已经有一段时间了,但让我们看看我能挖掘出来的东西:

正如atxe所说,你应该在执行这个动画之前将图层的锚点移动到1,.5,这样它就会围绕右边缘旋转。

以下是我们的“Kevin& Kell”卡通应用程序中的一些代码,它会在门的铰链上打开一扇门的动画:

//Open the door.
rotateAnimation = [CABasicAnimation animation];
rotateAnimation.keyPath = @"transform";
rotateAnimation.fromValue = [NSValue valueWithCATransform3D:CATransform3DIdentity];

//Pivot on the right edge (y axis rotation)
theTransform = CATransform3DIdentity;
  theTransform.m34 = -1/100.0;
  theTransform = CATransform3DRotate(theTransform, degreesToRadians(70), 0, 1, 0);


rotateAnimation.toValue = [NSValue valueWithCATransform3D:theTransform];

rotateAnimation.duration = 0.5;

// leaves presentation layer in final state; preventing snap-back to original state
rotateAnimation.removedOnCompletion = NO;
rotateAnimation.fillMode = kCAFillModeBoth; 

rotateAnimation.repeatCount = 0;
rotateAnimation.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut];
rotateAnimation.delegate = self;
[treeDoorImageView.layer addAnimation:rotateAnimation forKey:@"transform"];

变换逻辑与你的完全相同(我使用m34值-1 / 100表示​​更夸张的3D效果。你的-1/500设置更正常。)

请注意,我不是尝试从UIView动画块中创建动画,而是创建一个CABasicAnimation,并将它的fromValue和toValue属性设置为起始和结束变换值。

您应该能够将此代码用作动画的起点。

答案 1 :(得分:0)

您需要使用CAAnimation,而不是UIView块动画。

CABasicAnimation *animation = [CABasicAnimation animationWithKeyPath:@"transform"];
animation.duration = 2;
animation.fromValue = [NSValue valueWithCATransform3D:view.layer.transform]; // From the existing transform.
animation.toValue = [NSValue valueWithCATransform3D:transform]; // To the new one.

view.layer.transform = transform; // Set the new transform.
[view.layer addAnimation:animation forKey:@"door"]; // Animate visual change.

此外,正如 axte 指出的那样,您必须将图层的anchorPoint设置为(1, 0.5),以围绕图层的右边缘应用旋转。