Swift:如何获取旋转后UIImageView的正确宽高?
解决UIImageView旋转后尺寸异常的问题
嘿,我懂你遇到的这个麻烦——原本160x160的正方形视图,旋转后用frame取宽度变成了190,这其实是iOS视图坐标系的正常表现,我来帮你理清原因并给出针对性的解决方案:
为什么旋转后frame的宽度会变化?
当你给视图应用CGAffineTransform旋转变换时,frame代表的是父视图坐标系中能容纳当前视图的最小轴对齐矩形。旋转后的视图不再和父视图轴对齐,系统会自动计算出一个包围它的矩形,这个矩形的宽高自然会比原始正方形的边长要大(比如旋转45度时,这个矩形的边长是原正方形的对角线长度≈226)。
而bounds是视图自身的内部坐标系,默认情况下旋转变换不会修改它的尺寸——只要你没有手动调整过bounds,imgDraggingImage.bounds.size.width应该始终是160才对,如果它也变了,那大概率是你在其他逻辑里不小心修改了bounds。
两种场景的解决方案
场景1:想获取视图的原始宽度(不受旋转影响)
最简单的方式是在视图初始化时就记录下原始尺寸,之后直接复用这个值:
// 在视图创建完成后保存原始尺寸 let originalImageViewSize = imgDraggingImage.bounds.size // 后续任何时候需要原始宽度,直接调用 let originalWidth = originalImageViewSize.width // 始终返回160
场景2:想获取旋转后视图在父视图中的实际水平宽度(投影宽度)
如果需要计算旋转后视图在水平方向上的实际占用宽度,可以通过变换矩阵结合三角函数来计算:
func calculateRotatedHorizontalWidth(for view: UIView) -> CGFloat { let transform = view.transform let originalWidth = view.bounds.width let originalHeight = view.bounds.height // 计算水平方向的投影长度 let horizontalProjection = abs(originalWidth * cos(transform.a)) + abs(originalHeight * sin(transform.c)) return horizontalProjection } // 调用示例 let currentRotatedWidth = calculateRotatedHorizontalWidth(for: imgDraggingImage)
补充:优化你的旋转手势处理
另外注意,你的旋转手势函数里没有重置手势的rotation值,这会导致每次旋转时角度累积,可能让变换出现异常。建议修改成这样:
func transformUsingRecognizer(_ recognizer: UIGestureRecognizer, transform: CGAffineTransform) -> CGAffineTransform { if let rotateRecognizer = recognizer as? UIRotationGestureRecognizer { let newTransform = transform.rotated(by: rotateRecognizer.rotation) // 重置手势的rotation,避免下次旋转叠加之前的角度 rotateRecognizer.rotation = 0 return newTransform } return transform }
内容的提问来源于stack exchange,提问作者Azhar
相关产品推荐
相关产品推荐

