2015-06-23 9 views
5

Używam CGAffineTransformMakeRotation do obracania UIView wewnątrz bloku animacji i chcę go obrócić przeciwnie do ruchu wskazówek zegara dla 180º.CGAffineTransformMakeRotation z ujemnym M_PI

Jednak kiedy kładę

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

nadal obraca się w prawo. Co ja mylące jest to, że jeśli piszę „ręcznie” wartość M_PI, że działa zgodnie z oczekiwaniami

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

Dlaczego to zachowanie?

Edit: dodano Używam bloku animacji

+0

Nie mogę odtworzyć problemu w trybie c lub szybkim, zawsze obraca się w prawo - obracanie o -3.141592 daje oczekiwany efekt. – luk2302

Odpowiedz

8

Jak wspomniałem w moim pierwszym komentarzu i jak Segii już napisał: animacja weźmie najkrótsza odległość między miejscem, w którym znajduje się obecnie, a miejscem, do którego dąży. Imho najlepszym rozwiązaniem jest użycie CABasicAnimation wymuszanie obrót w lewo:

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

To będzie obrócić go o 180 w lewo w jednym zamachem.

Kąt określony w ostatnim wierszu + fromValue to kąt początkowy -> 0. Następnie obrót zostanie ustawiony na odległość (toValue - fromValue) = 0 - M_PI = - M_PI -> przeciwnie do ruchu wskazówek zegara o 180 stopni.

+0

to nie działa dla mnie z jakiegoś powodu. również używam 'CGFloat.pi' jako preferowanego z Swift 3.0 – NoSixties

5

Jak zrozumiałem, starasz się obracać widok w bloku animacji. animateWithDuration będzie zawsze wykonywać animację w najkrótszy możliwy sposób. Tak więc, M_PI i -M_PI daje tę samą pozycję docelową. Powodem, dla którego otrzymujesz oczekiwany kierunek animacji podczas ręcznego ustawiania, jest to, że twoja wartość ręczna jest naprawdę mniejsza od M_PI, więc najkrótsza droga do obrócenia jest przeciwna do ruchu wskazówek zegara.

Aby uzyskać oczekiwane zachowanie, musisz połączyć co najmniej dwie animacje, , dzieląc kąt obrotu. Na przykład

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

Albo dużo bardziej niezawodny, użyj CAKeyframeAnimation

Powiązane problemy