我正在尝试使用 CGAffineTransformRotate 旋转 UIImageView 约束,但视图在旋转时会抖动。如果我使用 CATransform3DRotate 旋转它的图层,这不会发生,但是一旦我编辑约束(更改常量),旋转的图像就会跳开。有没有人知道如何解决这个问题?
这是跳开的旋转图像的截图
我正在尝试使用 CGAffineTransformRotate 旋转 UIImageView 约束,但视图在旋转时会抖动。如果我使用 CATransform3DRotate 旋转它的图层,这不会发生,但是一旦我编辑约束(更改常量),旋转的图像就会跳开。有没有人知道如何解决这个问题?
这是跳开的旋转图像的截图
自动布局作用于 UIView 的框架。框架是根据视图的中心、边界和变换属性计算得出的。默认情况下 view.transform 只是 CGAffineTransformIdentity,在这种配置中,框架是一个与父视图相同方向的矩形,具有与视图边界相同的宽度和高度。
但是,当您修改 view.transform(或等效的 view.layer.transform)时,正如您所做的那样,这会破坏中心、边界和框架之间的可预测关系。例如,如果您的变换是 20 度旋转,则框架将不再具有与边界相同的宽度和高度。框架现在将是(我认为......)与超级视图相同的任何矩形,需要包含您现在旋转 20 度的原始矩形。
而且由于自动布局作用于 frame 属性,它现在很可能会产生您不想要的布局。
例如,假设您的视图在 10x10 框架矩形内呈现一个圆圈,该矩形通过空间限制与父视图左上角对齐。然后将其旋转 45 度。一个旋转的圆圈看起来是一样的。但是现在框架是旋转后可以包含原始矩形的最小矩形,这个最小的矩形是 10/sqrt(2) x 10/sqrt(2)。当自动布局将左上对齐应用到这个新框架时,您将看到您的圆圈向下移动并向右移动。它不再以 {5,5} 为中心,而是以 {5/sqrt(2),5/sqrt(2)} 为中心。
我认为解决此问题的方法是手动调整布局约束“常量”参数以纠正变换的效果,或者类似地覆盖 alignmentRectForFrame 以强制自动布局在调整为补偿变换的 alignmentRect 上工作,或者定义您的原始约束以绑定到可能不受变换影响的视图中心。
我刚刚在这里写了一篇关于这个问题的小文章:
我的结论是自动布局和视图转换不能很好地结合在一起。我给出了两个解决方案:(a) 仅使用不反击您打算应用的转换的约束,或者 (b) 通过对其不使用任何约束并将其translatesAutoresizingMask
属性设置为 YES 将视图完全脱离自动布局,这样这个视图的工作方式与他们在自动布局之前所做的一样。
我刚刚收到 Apple 支持团队的回复,他们通过覆盖 Superview 的 layoutSubviews 为我的问题提供了解决方案。这允许为特定视图应用特殊布局。这可能不是一个完美的解决方案,但它就像一个魅力,因为苹果建议它,如果它来自实现自动布局的工程师,它应该是一个很好的解决方案
我在这里添加了一个更完整的答案- 一个类似的问题。