如何在一个点上旋转CALayer

20

如何在选择的一个点旋转CALayer。

3个回答

37
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是您希望旋转的点。 centerrotationPoint位于包含视图的坐标空间中。


7

在此输入图片描述

  1. 定义要旋转的子层;
  2. 设置它在父层中的 boundspositionanchorPointanchorPoint 具有相对坐标,并指向一个 anchorPoint。 您的子层将围绕这个 anchorPoint 旋转;
  3. 添加变换。
例如,要围绕子层底部中心点在其父视图顶部中心点处旋转,请使用此代码:
    // 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)

1
不确定为什么(可能是由于坐标系误导),但建议的代码只有在我将anchorPoint更改为CGPoint(x: 0.5, y: 0)时才有效。 感谢详细的答案,非常有用。 - rkyr
如果使用nil作为forKey添加动画超过一次,将会增加内存使用量。 - fdcpp

0

请查看 CA 文档 此处

你想将变换设置为 CATransform3DRotate,例如:

CATransform3D current = myLayer.transform;
myLayer.transform = CATransform3DRotate(current, DEGREES_TO_RADIANS(20), 0, 1.0, 0);

1
这只能使图层围绕其当前中心旋转,而不能围绕任意点旋转。 - warrenm

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接