2015-06-23 9 views
5

Ich verwende CGAffineTransformMakeRotation, um eine UIView in einem Animationsblock zu drehen, und ich möchte es gegen den Uhrzeigersinn für 180º drehen.CGAffineTransformMakeRotation mit negativem M_PI

Allerdings, wenn ich

setzen
myView.animateWithDuration(0.5) 
myView.transform = CGAffineTransformMakeRotation(CGFloat(-M_PI)) 

es dreht sich immer noch im Uhrzeigersinn. Was ich ist verwirrend ist, dass wenn ich „von Hand“ der Wert von M_PI schreiben, als

// this will rotate counterclockwise 
myView.transform = CGAffineTransformMakeRotation(CGFloat(-3.14159265358979)) 

Warum dieses Verhalten erwartet funktioniert?

Edit: habe ich eine Animation Block

+0

Ich kann nicht reproduzieren Ihr Problem in objective-c oder swift, dreht immer im Uhrzeigersinn - Drehen um -3.141592 gibt den gewünschten Effekt. – luk2302

Antwort

8

Wie ich in meinem ersten Kommentar und wie Segii bereits geschrieben angegeben: die Animation nehmen die kürzeste Entfernung zwischen dem Wert, an dem es jetzt liegt, und dem, wo es sich befindet. Die beste Lösung ist imho CABasicAnimation zu verwenden, zum Erzwingen einer Drehung gegen den Uhrzeigersinn:

let anim = CABasicAnimation(keyPath: "transform.rotation") 
anim.fromValue = M_PI 
anim.toValue = 0 
anim.additive = true 
anim.duration = 2.0 

myView.layer.addAnimation(anim, forKey: "rotate") 
myView.transform = CGAffineTransformMakeRotation(CGFloat(-M_PI)) 

Diese um 180 entgegen dem Uhrzeigersinn in einem Rutsch dreht.

Der Winkel, den Sie in der letzten Zeile angeben + die fromValue ist der Ausgangswinkel -> 0. Und dann die Drehung wird den Abstand (toValue - fromValue) = 0 - M_PI = - M_PI gehen -> entgegen dem Uhrzeigersinn um 180 Grad-Drehung.

+0

das funktioniert aus irgendeinem Grund nicht für mich. auch ich benutze 'CGFloat.pi' als dies bevorzugt mit swift 3.0 – NoSixties

5

Wie verwende ich verstanden, du bist Ansicht innerhalb Animation Block zu drehen versucht. animateWithDuration führt die Animation immer auf dem kürzesten Weg aus. Also geben M_PI und -M_PI dieselbe Zielposition an. Der Grund, warum Sie bei der manuellen Einstellung die erwartete Animationsrichtung erhalten, ist, dass Ihr manueller Wert wirklich kleiner als M_PI ist. Daher ist der kürzeste Weg zum Drehen gegen den Uhrzeigersinn.

Um das erwartete Verhalten zu erhalten, müssen Sie mindestens zwei Animationen, , aufteilen, die den Rotationswinkel teilen. Zum Beispiel

//first animation block 
myView.transform = CGAffineTransformMakeRotation(CGFloat(-M_PI/2))CGAffineTransformMakeRotation; 
//second animation block 
myView.transform = CGAffineTransformMakeRotation(CGFloat(-M_PI/2))CGAffineTransformMakeRotation; 

Swift 3,0

myView.transform = CGAffineTransform(rotationAngle: CGFloat(-M_PI/2)) 

Oder viel zuverlässiger, verwenden CAKeyframeAnimation

Verwandte Themen