ios – Autolayout旋转轮

我正在尝试使用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经过调整以补偿变换,或者定义原始约束以绑定到视图的中心,这可能不受转换的影响.

相关文章

UITabBarController 是 iOS 中用于管理和显示选项卡界面的一...
UITableView的重用机制避免了频繁创建和销毁单元格的开销,使...
Objective-C中,类的实例变量(instance variables)和属性(...
从内存管理的角度来看,block可以作为方法的传入参数是因为b...
WKWebView 是 iOS 开发中用于显示网页内容的组件,它是在 iO...
OC中常用的多线程编程技术: 1. NSThread NSThread是Objecti...