旋转超级视图后计算 CGAffineTransform 矩阵

Posted

技术标签:

【中文标题】旋转超级视图后计算 CGAffineTransform 矩阵【英文标题】:Calculating the CGAffineTransform matrix after rotating the superview 【发布时间】:2012-05-08 15:04:56 【问题描述】:

这个很棘手!

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

【问题讨论】:

【参考方案1】:

你好,试试这个,请告诉我

viewB.transform=CGAffineTransformInvert(viewA.transform)

【讨论】:

这与viewB.transform=CGAffineTransformMakeRotation(-angle) 相同,因为CGAffineTransformInvert (CGAffineTransformMakeRotation(angle))CGAffineTransformMakeRotation(-angle) 完全相同。正如我所提到的,旋转是不够的。 我不明白你的答案,你想最终达到什么目的。【参考方案2】:

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

首先,为什么不从视图 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];

【讨论】:

这与动画无关!我并不是说我为变换属性设置了动画。我知道我可以将 B 放在 A 之外,但这并不能回答我的问题。 您正在立即对视图应用变换?这不会让用户感到困惑吗?如果视图以流畅的运动从一个位置过渡到下一个位置,那确实是一个动画。这两个建议都可以防止您的视图被变换搞砸。 如果您不愿意尝试其他动画样式,为什么不“想”使视图 B 成为同级视图。这没有任何意义。 好的,与此同时,我通过创建一个新视图并将 A 和 B 添加为子视图来解决它。但我仍然对当 B 是 A 的子视图时如何计算变换矩阵感兴趣。而且我只会接受给出正确公式的答案。 你在开玩笑吗?我的 CATransaction 使视图动画保持同步。这怎么不是答案?你甚至尝试过吗?我刚刚为您的问题制作了一个示例项目,它工作得很好。在拒绝之前尝试答案。

以上是关于旋转超级视图后计算 CGAffineTransform 矩阵的主要内容,如果未能解决你的问题,请参考以下文章

如何在设备旋转后重新计算约束

UITextContainerView 仅在以大于 45° 的角度旋转时才调整为他的 UITextView 超级视图的大小

旋转放置和移动视图 (UIView)

为啥转换后的 UIView 会与层次结构中较高的其他视图重叠?

Office 超级录屏如何旋转视频90度之后保存

超级视图框架更改后更新子视图的约束