如何围绕UIView的左上角坐标进行旋转?
让UIView围绕左上角旋转的两种解决方案
没问题,要实现UIView围绕左上角旋转,默认的CGAffineTransform(rotationAngle:)是围绕视图中心点旋转的,咱们得调整一下变换逻辑或者图层锚点,这里给你两种实用方案:
方案一:修改图层锚点(最直观)
UIView的图层CALayer有个anchorPoint属性,默认值是(0.5, 0.5)(对应视图中心点),把它改成(0, 0)就对应左上角了。不过要注意:修改锚点会导致视图位置偏移,所以需要同步修正position属性来保持视图原来的位置不变。
示例代码:
// 保存视图当前的位置 let originalPosition = rectangle.layer.position // 将锚点设置为左上角 rectangle.layer.anchorPoint = CGPoint(x: 0, y: 0) // 修正position,确保视图位置不偏移 rectangle.layer.position = originalPosition // 执行旋转(用你已有的角度转弧度扩展) rectangle.transform = CGAffineTransform(rotationAngle: 90.degreesToRadians)
方案二:使用组合变换(不修改图层属性)
如果不想改动图层的锚点,可以通过平移-旋转-平移的组合变换来实现:先把视图的左上角平移到坐标系原点,旋转后再平移回原位置。变换的顺序很关键,要按正确的顺序组合。
示例代码:
let rotationAngle = 90.degreesToRadians // 1. 平移视图,让左上角对齐坐标系原点 let translateToOrigin = CGAffineTransform(translationX: -rectangle.bounds.minX, y: -rectangle.bounds.minY) // 2. 执行旋转操作 let rotateTransform = CGAffineTransform(rotationAngle: rotationAngle) // 3. 平移回视图原来的位置 let translateBack = CGAffineTransform(translationX: rectangle.bounds.minX, y: rectangle.bounds.minY) // 组合变换(顺序:先平移到原点 → 旋转 → 平移回原位) rectangle.transform = translateToOrigin.concatenating(rotateTransform).concatenating(translateBack)
补充优化你的角度转弧度扩展
你原来的扩展可以稍微优化一下,去掉不必要的Int转换,让它支持所有BinaryInteger类型(比如UInt、Int64等):
extension BinaryInteger { var degreesToRadians: CGFloat { return CGFloat(self) * .pi / 180 } }
内容的提问来源于stack exchange,提问作者Alwin Vazhappilly
相关产品推荐
相关产品推荐

