旋转超视图后计算CGAffineTransform矩阵

时间:2012-05-08 15:04:56

标签: iphone ios uiview rotation cgaffinetransform

这个很棘手!

我有视图A和视图B,它是视图A的子视图。两个视图的帧都是不变的。

我通过改变变换矩阵来旋转视图A:

viewA.transform = CGAffineTransformMakeRotation(angle);

现在我想调整视图B的变换矩阵,使视觉位置和旋转保持不变,即B在改变A的旋转角度时不得移动/旋转。

显然我需要在相反方向旋转视图B,但这还不够。

我尝试了这个,但B仍然摇摆不定:

viewB.transform = CGAffineTransformTranslate(CGAffineTransformMakeRotation(-angle), viewA.bounds.size.width, viewA.bounds.size.height);

也许正确的矩阵也取决于viewB的框架...也许我需要使用正弦和余弦......?

我知道,我可以简单地让B成为A的兄弟姐妹观点,但我不想这样做。

2 个答案:

答案 0 :(得分:0)

嗨试试这个让我知道请

viewB.transform=CGAffineTransformInvert(viewA.transform)

答案 1 :(得分:0)

突然出现了两件事。

首先,为什么不从视图A中删除视图B并将其附加到视图A的超视图(即使它仅用于旋转序列)?它在视觉上是相同的。

我的另一个想法是将动画包装在CATransaction中以保持动画同步。

我仍然建议不要在视图A上保持视图B并且必须运行两个动画,而不是仅仅一个。你是在视图A中保持视图B的原因,因为它的剪辑是基于它的界限吗?

这是使用图层,但它与视图的作用相同:

[CATransaction begin];
[CATransaction flush];
[CATransaction setAnimationDuration:2.0f];
[CATransaction setAnimationTimingFunction:[CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut]];
CATransform3D transform = CATransform3DMakeRotation(M_PI/4, 0, 0, 1);
outerLayer.transform = CATransform3DConcat(outerLayer.transform, transform);
innerLayer.transform = CATransform3DInvert(outerLayer.transform);
[CATransaction commit];