You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何围绕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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 06:51:33