2016-10-08 6 views
0

Hallo, ich versuche einen dreieckigen CAShapeLayer zu drehen. Der NorthPole-CAShapeLayer ist in einer benutzerdefinierten UIView-Klasse definiert. Ich habe zwei Funktionen in der ersten Klasse, um die Layer-Eigenschaften einzurichten und eine, um die Rotation zu animieren. Die Rotationsanimation funktioniert einwandfrei, kehrt jedoch nach Abschluss der Rotation in die ursprüngliche Position zurück. Ich möchte, dass die Ebene nach der Rotationsanimation in dem angegebenen Winkel (positionTo = 90.0) bleibt.CATransform3DMakeRotation Ankerpunkt und Position in Swift

Ich versuche, die Position nach der Umwandlung festzulegen, um die richtige Position nach der Animation beizubehalten. Ich habe auch versucht, die Position von der Präsentation() -Methode zu bekommen, aber das war nicht hilfreich. Ich habe viele Artikel über Rahmen, Grenzen und Ankerpunkte gelesen, aber ich kann immer noch nicht verstehen, warum diese Transformationsrotation nicht funktioniert.

private func setupNorthPole(shapeLayer: CAShapeLayer) { 
    shapeLayer.frame = CGRect(x: self.bounds.width/2 - triangleWidth/2, y: self.bounds.height/2 - triangleHeight, width: triangleWidth, height: triangleHeight)//self.bounds 
    let polePath = UIBezierPath() 
    polePath.move(to: CGPoint(x: 0, y: triangleHeight)) 
    polePath.addLine(to: CGPoint(x: triangleWidth/2, y: 0)) 
    polePath.addLine(to: CGPoint(x: triangleWidth, y: triangleHeight)) 
    shapeLayer.path = polePath.cgPath 
    shapeLayer.anchorPoint = CGPoint(x: 0.5, y: 1.0) 

Animieren Funktion:

private func animate() { 
    let positionTo = CGFloat(DegreesToRadians(value: degrees)) 
    let rotate = CABasicAnimation(keyPath: "transform.rotation.z") 
    rotate.fromValue = 0.0 
    rotate.toValue = positionTo //CGFloat(M_PI * 2.0) 
    rotate.duration = 0.5 
    northPole.add(rotate, forKey: nil) 
    let present = northPole.presentation()! 
    print("presentation position x " + "\(present.position.x)") 
    print("presentation position y " + "\(present.position.y)") 


    CATransaction.begin() 
    northPole.transform = CATransform3DMakeRotation(positionTo, 0.0, 0.0, 1.0) 
    northPole.position = CGPoint(x: self.bounds.width/2, y: self.bounds.height/2) 
    CATransaction.commit() 
} 
+0

Okay, traurig über meine schlechte Antwort früher. Ich werde nur vorschlagen, dass Sie das 'Geschenk' fallen lassen, das' Begin' weglassen, das 'Commit' fallen lassen und mein Buch lesen, um zu erfahren, wie man eine Drehung mit CABasicAnimation macht: http://www.apeth.com /iOSBook/ch17.html#_using_a_cabasicanimation – matt

Antwort

0

das Problem zu beheben, in der benutzerdefinierten UIView Klasse hatte ich layoutSubviews() mit folgenden außer Kraft zu setzen:

super.layoutSubviews() 
    let northPoleTransform: CATransform3D = northPole.transform 
    northPole.transform = CATransform3DIdentity 
    setupNorthPole(northPole) 
    northPole.transform = northPoleTransform 
Verwandte Themen