2010-10-13 9 views

Antwort

34
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); 

Wo center das Zentrum Ihrer Schicht ist, rotationAngle in Radian ist (positiv gegen den Uhrzeigersinn), und rotationPoint ist die Punkt, über den Sie drehen möchten. center und rotationPoint befinden sich im Koordinatenraum der enthaltenden Ansicht.

+0

Dank Warrenm seine Arbeits ....... –

+0

Sie meine Tage gerettet! Vielen Dank!! –

1

Schauen Sie sich die CA Dokumentation here.

Sie wollen zum Beispiel die Transformation zu einem CATransform3DRotate, setzen:

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

Dies wird nur zum Drehen der Schicht über sein aktuelles Zentrum genügen, nicht willkürlich Punkt. – warrenm

2

enter image description here

  1. Definieren Sie Ihre Unterschicht, die Sie drehen möchten;
  2. Legen Sie seine bounds, position in Superlayer und anchorPoint. anchorPoint hat relative Koordinaten und zeigt auf ein anchorPoint. Ihre Sublayer wird sich um diese anchorPoint drehen;
  3. hinzufügen Transformation.

Um zum Beispiel eine Unterschicht auf seiner Super oberen Mittelpunkt um Unterschicht der untere Mitte zu drehen, verwenden Sie diesen Code:

// 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)