2017-02-12 2 views
2

Mit diesem Code:Wie kann ich den "Sprung" in meiner CABasicAnimation beseitigen?

func rotateTheView(_ aView: UIView, inClockwiseDirection isClockwise: Bool) { 
    let multiplier = (isClockwise ? 1 : -1) 
    let key = (isClockwise ? "Spin" : "Rotate") 
    var rotation: CABasicAnimation? 
    rotation = CABasicAnimation(keyPath: "transform.rotation") 
    rotation!.fromValue = Int(0) 
    let multiplicand = multiplier * 2 
    rotation!.toValue = Int(Double(multiplicand) * .pi) 
    rotation!.duration = 30 // Speed 
    rotation!.timingFunction = CAMediaTimingFunction(name: kCAMediaTimingFunctionLinear) 
    rotation!.repeatCount = HUGE //HUGE_VALF Repeat forever. 
    aView.layer.add(rotation!, forKey: key) 
} 

ich die Animation Ich will bekommen. (Entweder dreht sich ein Rad oder eine Zelle dreht sich schnell genug in die entgegengesetzte Richtung, um immer genau die richtige Seite nach oben zu bleiben).

Wenn jedoch die 30 Sekunden (Dauer) abgelaufen sind, gibt es ein Flackern, wenn die Ansicht zu der Darstellung vor der Animation zurückspringt.

Ich verstehe, dass es so funktionieren soll.

Wie kann ich die Drehung auf das "Vorher" -Bild anwenden, so dass nach Ablauf der Zeit keine Zellen mehr springen?

Wenn Sie die Dauer der Animation erhöhen, verlangsamt sich der Spin des Rads, so dass dies keine geeignete Lösung ist.

Wenn #22521690 gilt, verstehe ich nicht, wie - ich habe keine explizite CAT-Transaktion.

+1

Warum deklarieren Sie "Rotation" als Optional? – matt

+0

Ja, ich muss es aufräumen. Ich habe dies vor ein paar Jahren von Ziel c umgesetzt. Ich überprüfe es erst kürzlich. – Mozahler

+0

Meine Quelle aktualisiert. Danke für das Aufzeigen! – Mozahler

Antwort

2

Versuchen

rotation!.toValue = Double(multiplicand) * .pi 

statt

rotation!.toValue = Int(Double(multiplicand) * .pi) 

Das Problem mit dem Radiant Präzision ist, die aufgrund Int Umwandlung verloren.

+0

Wow !!! Tausend Dank! – Mozahler

+0

jederzeit! Was Matt und Duncan gesagt haben, ist wahr. aber in Ihrem Fall ist die volle Rotation und der Anfangs- und Endzustand gleich. Sie müssen also keine Werte zurücksetzen –

+0

Guter Fang. Ich hätte diesen Teil genauer betrachten sollen. Ich dachte, die Int-Umwandlung auf dem toValue wäre seltsam, aber hörte nicht auf zu denken. –

2

In der nächsten Zeile nach dem Anwenden der Animation auf den Layer legen Sie die Eigenschaft, die Sie animieren, auf den Endwert fest.

Da sich eine Animation "im Flug" befindet, ist die normale Anzeige der Ebene die Präsentationsebene, eine spezielle Animationsschicht.

Sobald die Animation abgeschlossen ist, wird die Präsentationsschicht ausgeblendet/entfernt und die tatsächliche Ebene wird belichtet. Wenn es am Ende der Animation denselben Status wie die Präsentationsebene hat, gibt es keinen Sprung.

Dieser Code könnte wie folgt aussehen:

func rotateTheView(_ aView: UIView, inClockwiseDirection isClockwise: Bool) { 
    let multiplier = (isClockwise ? 1 : -1) 
    let key = (isClockwise ? "Spin" : "Rotate") 
    var rotation: CABasicAnimation? 
    rotation = CABasicAnimation(keyPath: "transform.rotation") 
    rotation!.fromValue = 0.0 
    let multiplicand = multiplier * 2 
    let finalAngle = Double(multiplicand) * .pi 
    rotation!.toValue = finalAngle 
    rotation!.duration = 30 // Speed 
    rotation!.timingFunction = CAMediaTimingFunction(name: kCAMediaTimingFunctionLinear) 
    rotation!.repeatCount = HUGE //HUGE_VALF Repeat forever. 
    aView.layer.add(rotation!, forKey: key) 

    //------------------- 
    //Set the final transform on the layer to the final rotation, 
    //but without animation 
    CATransaction.begin() 
    CATransaction.setDisableActions(true) 
    let finalTransform = CATransform3DMakeRotation(CGFloat(finalAngle), 0.0, 0.0, 1.0) 
    aView.layer.transform = finalTransform 
    CATransaction.commit() 
    //------------------- 
} 
+0

Das ist genau das, was ich nicht kann: Geben Sie den Endwert für die Ebene an. – Mozahler

+0

Siehe die Bearbeitung meiner Antwort. –

+0

@matt, guter Punkt. Ich hatte dieses schöne, verwirrende Detail vergessen. –

Verwandte Themen