如何实现CAShapeLayer围绕指定点的旋转动画?修正旋转原点错误
解决方案:让CALayer围绕父层中心旋转
要实现红色指针围绕蓝色方块中心旋转,核心是正确配置指针CALayer的锚点与位置,以下是具体操作:
1. 同步设置锚点与位置
CALayer的anchorPoint决定了旋转的轴心,默认是自身bounds中心,但如果指针的起点不在蓝色方块中心,需要手动调整:
- 把指针的
anchorPoint设为自身的旋转端(比如线条的起点,对应坐标(0, 0.5),保证线条以起点为轴旋转) - 将指针的
position设为蓝色方块的中心坐标,确保旋转轴心落在目标位置
代码示例:
// 获取蓝色方块的中心坐标 let blueCenter = CGPoint(x: blueLayer.bounds.midX, y: blueLayer.bounds.midY) // 设置指针的锚点为自身起点(线条左端) pointerLayer.anchorPoint = CGPoint(x: 0, y: 0.5) // 将指针的锚点位置对齐到蓝色方块中心 pointerLayer.position = blueCenter
2. 保留原有旋转动画逻辑
你的旋转动画代码无需修改,只要锚点和位置配置正确,动画就会围绕蓝色方块中心执行:
let rotationAnimation = CABasicAnimation(keyPath: "transform.rotation.z") rotationAnimation.fromValue = CGFloat.pi * 2.0 rotationAnimation.toValue = 0 rotationAnimation.duration = 2.0 rotationAnimation.isCumulative = true rotationAnimation.repeatCount = Float.greatestFiniteMagnitude pointerLayer.add(rotationAnimation, forKey: "rotationAnimation")
关键说明
单独修改anchorPoint会导致图层位置偏移,因为position是锚点在父层中的坐标。必须同步调整position到目标旋转中心,才能让锚点准确落在蓝色方块中心,实现预期的旋转效果。
内容的提问来源于stack exchange,提问作者cool8jay
相关产品推荐
相关产品推荐

