顺序UIView变换

时间:2012-01-21 03:52:47

标签: iphone objective-c animation uiview catransform3d

我有一个关于将多个变换应用于UIView的问题。例如,当我围绕它的中心点旋转UIView时,然后尝试围绕它之外的点旋转它,第二个动画全部搞砸了,例如,它会抖动或以完全不同的方式旋转。我怎样才能使第一个动画不影响第二个动画,但是当第二个动画播放时它仍然存在?

编辑:这是代码。首先,我围绕它的中心点旋转视图:

CALayer *layer = view.layer;

CATransform3D aTransform = CATransform3DIdentity;
CGFloat zDistance = 2000;
aTransform.m34 = 1.0 / -zDistance;  
scrollView.layer.sublayerTransform = aTransform;

CGFloat subviewX = 0.5;
CGFloat subviewY = 0.5;
[self setAnchorPoint:CGPointMake(subviewX, subviewY) forView:view];

CATransform3D bTransform = CATransform3DIdentity;  
CABasicAnimation *rotateAnim = [CABasicAnimation animationWithKeyPath:@"transform"];  
rotateAnim.fromValue= [NSValue valueWithCATransform3D:bTransform];
bTransform = CATransform3DRotate(aTransform,-20*M_PI/180, 1, 1, 0);
rotateAnim.duration=0.05;
rotateAnim.toValue=[NSValue valueWithCATransform3D:bTransform];
layer.transform = bTransform;
[layer addAnimation:rotateAnim forKey:nil];

现在图层已旋转,我想在左侧屏幕边框周围翻转它:

CALayer *layer = view.layer;

CATransform3D aTransform = CATransform3DIdentity;
CGFloat zDistance = 2000;
aTransform.m34 = 1.0 / -zDistance;  
tileScrollView.layer.sublayerTransform = aTransform;

CGFloat subviewX = ((1/view.frame.size.width)*(view.frame.origin.x));
CGFloat subviewY = 0.5;
[self setAnchorPoint:CGPointMake(-subviewX, subviewY) forView:view];

CATransform3D bTransform = layer.transform;
CABasicAnimation *rotateAnim = [CABasicAnimation animationWithKeyPath:@"transform"];
rotateAnim.fromValue= [NSValue valueWithCATransform3D:bTransform];
bTransform = CATransform3DMakeRotation(-M_PI_2, 0, 1, 0);
rotateAnim.duration=0.2;
rotateAnim.toValue=[NSValue valueWithCATransform3D:bTransform];
layer.transform = bTransform;
[layer addAnimation:rotateAnim forKey:nil];

由于我想要翻转旋转的图层,我在第二个动画的开头放了CATransform3D bTransform = layer.transform而不是CATransform3D bTransform = CATransform3DIdentity,但是再一次,这只会混淆动画

我遇到的另一个类似的问题是我有一个包含9个子视图的UIView,其中一个子视图每秒翻转它的中心点。但是每当我将转换应用到那些9个UIViews的superView时,subViews的布局就会搞砸了。有谁知道如何防止这种情况?任何帮助将不胜感激。提前谢谢!

1 个答案:

答案 0 :(得分:2)

两件事:

  1. 在第一个转换中,您执行此操作:

    bTransform = CATransform3DRotate(aTransform,-20*M_PI/180, 1, 1, 0);
    

    意味着您围绕x轴和y轴之间的45°轴旋转。这可能是你想要做的,但看起来很奇怪。考虑改为

    bTransform = CATransform3DRotate(aTransform,-20*M_PI/180, 0, 1, 0);
    
  2. 在第二步中,如果您只想将变换添加到当前变换(即再旋转180°),则需要更改此行

    bTransform = CATransform3DMakeRotation(-M_PI_2, 0, 1, 0);
    

    bTransform = CATransform3DRotate(bTransform, -M_PI_2, 0, 1, 0);
    

    这会将转换应用于现有转换,而不是忽略当前转换。