2016-07-15 7 views
0

Ich spiele mit dem Drehen eines UIImageView herum. Die Rotationsanimation funktioniert gut, aber am Ende, wenn das Bild in seine ursprüngliche Ausrichtung zurückkehrt. Im Folgenden finden Sie eine Erweiterung ich es drehen verwenden:iOS Schnelle Drehanimation bleibt nicht stehen

extension UIView { 
func rotate(duration: CFTimeInterval = 1.0, degrees:Double, completionDelegate: AnyObject? = nil) { 
    let rotateAnimation = CABasicAnimation(keyPath: "transform.rotation") 
    rotateAnimation.fromValue = 0.0 
    let radians = CGFloat(degrees * M_PI/degrees) 
    rotateAnimation.toValue = CGFloat(radians) 
    rotateAnimation.duration = duration 

    if let delegate: AnyObject = completionDelegate { 
     rotateAnimation.delegate = delegate 
    } 
    self.layer.addAnimation(rotateAnimation, forKey: nil) 
} 

}

Ich habe Auto-Layout ausgeschaltet. Was vermisse ich?

Antwort

0

In der geraden Kernanimation müssen Sie die Eigenschaft, die Sie animieren, tatsächlich festlegen. Das Animieren alleine zeigt nur den Effekt und springt dann zum Startwert zurück. Während der fillMode und removedOnCompletion wird visuell arbeiten, der tatsächliche Wert der Rotation-Eigenschaft auf der Ebene bleibt der ursprüngliche Wert, nicht der Endwert, den Sie in der Eigenschaft für Ihre Animation angegeben. Das Endergebnis ist nur visuelle.

Ich würde Ihnen vorschlagen, entweder die UIView Animationsfunktionen wie Jan oder vorgeschlagen, können Sie explizit die Eigenschaft in Ihrer Animation gesetzt - so etwas wie:

func rotate(duration: CFTimeInterval = 1.0, degrees:Double, completionDelegate: AnyObject? = nil) { 
    let rotateAnimation = CABasicAnimation(keyPath: "transform.rotation") 
    rotateAnimation.fromValue = 0.0 
    let radians = CGFloat(degrees * M_PI/degrees) 
    rotateAnimation.toValue = CGFloat(radians) 
    rotateAnimation.duration = duration 

    if let delegate: AnyObject = completionDelegate { 
     rotateAnimation.delegate = delegate 
    } 
    self.layer.addAnimation(rotateAnimation, forKey: nil) 

    // Actually set the layer's property 
    self.layer.transform = CATransform3DMakeRotation(radians, 0.0, 0.0, 1.0) 
} 
0

sollten Diese Eigenschaften helfen:

rotateAnimation.fillMode = kCAFillModeForwards 
rotateAnimation.removedOnCompletion = false 
0

Sie auch animateWithDuration Ihre Ansicht animieren nutzen könnten.

func rotate(duration: NSTimeInterval, degrees: CGFloat, completionDelegate: (finished: Bool) ->()) { 
    let radians = CGFloat(degrees * CGFloat(M_PI)/degrees) 
    UIView.animateWithDuration(duration, animations: { 
     self.transform = CGAffineTransformMakeRotation(radians) 
    }, completion: completionDelegate) 
}