我正在尝试使用CGAffineTransformRotate旋转UI
ImageView约束,但是视图在旋转时抖动.如果我使用CATransform3DRotate旋转它的图层,则不会发生这种情况,但只要我编辑约束(更改常量),旋转的图像就会跳开.有谁有想法如何解决这个问题?
这是跳过的旋转图像的屏幕截图
解决方法
自动布局作用于UIView的框架.框架根据视图的中心,边界和变换属性计算.默认情况下,view.transform只是CGAffineTransformIdentity,在此配置中,框架是一个与superview相同的矩形,其宽度和高度与视图的边界相同.
但是,当您修改view.transform(或等效地,view.layer.transform)时,正如您所做的那样,这会破坏center,bounds和frame之间的可预测关系.例如,如果您的变换是20度旋转,那么框架将不再具有与边界相同的宽度和高度.框架现在(我认为……)任何矩形,与超视图相同,需要包含原来的矩形,现在旋转20度.
由于自动布局会对框架属性起作用,因此现在可能会产生您不想要的布局.
例如,假设您的视图在10×10帧矩形内呈现一个圆,该矩形通过空间约束与超视图左上对齐.然后你旋转45度.旋转的圆圈看起来相同.但现在框架是最小的矩形,一旦旋转就可以包含原始矩形,这个最小的矩形是10 / sqrt(2)x 10 / sqrt(2).当自动布局将左上角对齐应用于此新帧时,您将看到您的圆圈向下移动并向右移动.它不是以{5,5}为视觉中心,而是以{5 / sqrt(2),5 / sqrt(2)}为中心.
我认为解决这个问题的方法是手动调整布局约束“常量”参数以校正变换的效果,或者类似地覆盖alignmentRectForFrame以强制自动布局在alignRect上工作,alignRect经过调整以补偿变换,或者定义原始约束以绑定到视图的中心,这可能不受转换的影响.