Autolayout旋转车轮

时间:2012-10-24 07:01:02

标签: ios cgaffinetransform autolayout catransform3d

我正在尝试使用CGAffineTransformRotate旋转UIImageView约束,但是视图在旋转时抖动。如果我使用CATransform3DRotate旋转它的图层,则不会发生这种情况,但只要我编辑约束(更改常量),旋转的图像就会跳开。有谁有想法如何解决这个问题?

这是跳过enter image description here

的旋转图像的屏幕截图

3 个答案:

答案 0 :(得分:10)

自动布局作用于UIView的框架。框架根据视图的中心,边界和变换属性计算。默认情况下,view.transform只是CGAffineTransformIdentity,在此配置中,框架是一个与superview相同的矩形,其宽度和高度与视图的边界相同。

但是,当您修改view.transform(或等效地,view.layer.transform)时,正如您所做的那样,这会破坏center,bounds和frame之间的可预测关系。例如,如果您的变换是20度旋转,那么框架将不再具有与边界相同的宽度和高度。框架现在(我认为......)任何矩形,与超视图相同,需要包含原来的矩形,现在旋转20度。

由于自动布局会对框架属性起作用,因此现在可能会生成您不想要的布局。

例如,假设您的视图在10x10帧矩形内呈现一个圆,该矩形通过空间约束与超视图左上对齐。然后你旋转45度。旋转的圆圈看起来相同。但现在框架是最小的矩形,一旦旋转就可以包含原始矩形,这个最小的矩形是10 / sqrt(2)x 10 / sqrt(2)。当自动布局将左上角对齐应用于此新帧时,您将看到您的圆圈向下移动并向右移动。它不是以{5,5}为视觉中心,而是以{5 / sqrt(2),5 / sqrt(2)}为中心。

我认为解决这个问题的方法是手动调整布局约束“常量”参数以校正变换的效果,或者类似地覆盖alignmentRectForFrame以强制自动布局在alignRect上工作,alignRect经过调整以补偿用于转换,或者定义原始约束以绑定到可能不受转换影响的视图中心。

答案 1 :(得分:3)

我刚刚在这里写了一篇关于这个问题的文章:

How do I adjust the anchor point of a CALayer, when Auto Layout is being used?

我的结论是自动布局和视图转换不能很好地协同工作。我给出了两个解决方案:(a)仅使用不反对您打算应用的转换的约束,或者(b)通过不对其使用约束并设置其translatesAutoresizingMask属性来完全取消autolayout的视图为YES,这样就可以按照自动布局之前的方式为这个视图工作。

答案 2 :(得分:1)

我刚听到Apple支持团队的回复,他们通过覆盖Superview的layoutSubviews为我的问题提供了解决方案。这允许为特定视图应用特殊布局。这可能不是一个完美的解决方案,但它就像一个魅力,因为苹果公司建议它,如果它来自实施Autolayout的Engeneers它应该是一个很好的解决方案

我添加了更完整的答案here - 类似的问题。

相关问题