旋转超级视图后计算 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 超级视图的大小