顺序 UIView 转换

Posted

技术标签:

【中文标题】顺序 UIView 转换【英文标题】:Sequential UIView Transform 【发布时间】:2012-01-21 03:52:46 【问题描述】:

我有一个关于将多个转换应用于 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 个 UIView 的 superView 应用转换时,子视图的布局就会变得混乱。有谁知道如何防止这种情况?任何帮助将不胜感激。提前致谢!

【问题讨论】:

有多种方法可以为视图设置动画,因此如果不向我们展示,我们将不知道您在做什么。 【参考方案1】:

两件事:

    在第一次转换中,你这样做:

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

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

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

    在第二步中,如果你只是想将变换添加到当前变换上(即再旋转180°),你需要改变这一行

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

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

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

【讨论】:

以上是关于顺序 UIView 转换的主要内容,如果未能解决你的问题,请参考以下文章

UIView 显示顺序问题?

如何更改 UIView 的 z 索引或堆栈顺序?

UIView 常见属性

UIViewController的生命周期及方法调用顺序

OPENGL矩阵顺序与调用顺序相反

Swift按顺序绘制多个圆圈