1

这个很棘手!

我有视图 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 的兄弟视图,但我不想这样做。

4

2 回答 2

0

有两件事突然出现在我的脑海中。

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

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

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

这适用于图层,但它适用于视图:

[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];
于 2012-05-08T15:14:58.670 回答
0

嗨试试这个,让我知道请

viewB.transform=CGAffineTransformInvert(viewA.transform)
于 2012-05-08T15:11:04.320 回答