【发布时间】:2010-10-13 18:45:11
【问题描述】:
如何在一个选定的点旋转 CALayer。
【问题讨论】:
标签: iphone core-animation
如何在一个选定的点旋转 CALayer。
【问题讨论】:
标签: iphone core-animation
CATransform3D transform = CATransform3DIdentity;
transform = CATransform3DTranslate(transform, rotationPoint.x-center.x, rotationPoint.y-center.y, 0.0);
transform = CATransform3DRotate(transform, rotationAngle, 0.0, 0.0, -1.0);
transform = CATransform3DTranslate(transform, center.x-rotationPoint.x, center.y-rotationPoint.y, 0.0);
center 是图层的中心,rotationAngle 以弧度表示(正数为逆时针),rotationPoint 是您希望旋转的点。 center 和 rotationPoint 在包含视图的坐标空间中。
【讨论】:
anchorPoint中设置其bounds、position。 anchorPoint 具有相对坐标并指向anchorPoint。您的子图层将围绕此 anchorPoint 旋转;例如,要围绕子图层的底部中心在其父视图顶部中心点上旋转子图层,请使用以下代码:
// 1
let rect = CGRect(x: 0,
y: 0,
width: 20,
height: 20)
let path = UIBezierPath(rect: rect)
let sublayer = CAShapeLayer()
sublayer.fillColor = UIColor.green.cgColor
sublayer.path = path.cgPath
superlayer.addSublayer(sublayer)
// 2
sublayer.bounds = rect
sublayer.position = CGPoint(x: superlayer.bounds.size.width/2, y: 0)
sublayer.anchorPoint = CGPoint(x: 0.5, y: 1)
// 3
let rotationAnimation = CABasicAnimation(keyPath: "transform.rotation.z")
rotationAnimation.toValue = 2*CGFloat.pi
rotationAnimation.duration = 3
rotationAnimation.fillMode = kCAFillModeForwards
rotationAnimation.isRemovedOnCompletion = false
sublayer.add(rotationAnimation, forKey: nil)
【讨论】:
anchorPoint 更改为CGPoint(x: 0.5, y: 0) 时才有效,感谢您的详细回答,非常有用
forKey 为nil 添加动画如果多次使用会增加内存使用率
查看 CA 文档here。
您想将变换设置为 CATransform3DRotate,例如:
CATransform3D current = myLayer.transform;
myLayer.transform = CATransform3DRotate(current, DEGREES_TO_RADIANS(20), 0, 1.0, 0);
【讨论】: