как вращать CALayer в одной точке - PullRequest
20 голосов
/ 13 октября 2010

как повернуть CALayer в одной выбранной точке.

Ответы [ 3 ]

37 голосов
/ 14 октября 2010
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 находятся в координатном пространстве содержащего представления.

4 голосов
/ 16 ноября 2017

enter image description here

  1. Определите свой подслой, который вы хотите повернуть;
  2. Установите его bounds, position в суперслое и anchorPoint. anchorPoint имеет относительные координаты и указывает на 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)
0 голосов
/ 13 октября 2010

Ознакомьтесь с документацией CA здесь .

Вы хотите установить преобразование в CATransform3DRotate, например:

CATransform3D current = myLayer.transform;
myLayer.transform = CATransform3DRotate(current, DEGREES_TO_RADIANS(20), 0, 1.0, 0);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...