2009-02-05 10 views
16

Próbuję obracać niektóre UIView wokół jego środka, więc prosty kod idzie coś takiego (w Pseudokod):obrócić UIView wokół jego środka, ale kilka razy

[UIView beginAnimations:@"crazyRotate" context:nil]; 
[UIView setAnimationDuration:1.0]; 
someview.transform = CGAffineTransformMakeRotation(angle); 
[UIView commitAnimations] 

teraz jeżeli ustawić kąt powiedzmy M_PI/2, ta rzecz ładnie się obraca. jeśli ustawię go na 2 * M_PI, to znaczy, że nie "nic". Rozumiem, że matryca przekłada się na coś, co nic nie robi (obrót 360 oznacza "pobyt" w pewnym sensie), jednak chcę go obrócić 5 razy (pomyśl o skali obracającej się gazety przychodzącej na ciebie efekt - jestem nie wspaniale w opisywaniu, mam nadzieję, że ktoś to zrozumie). Próbowałem więc dodać kąt ustawienia do 180 stopni (M_PI) i dodać zagnieżdżony animatationBlock. ale domyślam się, że ponieważ ustawiam tę samą właściwość (someview.transition) znowu ją zignoruje). Próbowałem ustawić liczbę powtórzeń animacji na 2 z kątem M_PI, ale wydaje się, że po prostu obraca się o 180 stopni, powraca do pozycji prostej, a następnie ponownie rozpoczyna obracanie.

Tak, jestem trochę pomysłów, każda pomoc doceniona! - t

+0

można również rozpocząć tutaj: https://github.com/jonasschnelli/UIView-i7Rotate360 bardzo łatwe do wdrożenia i zmiany. –

+0

możliwy duplikat [UIView Infinite 360 ​​degree rotation animation?] (Http://stackoverflow.com/questions/9844925/uiview-infinite-360-degree-rotation-animation) –

Odpowiedz

36

Możesz użyć następującej animacji we właściwości warstwy UIView. Testowałem to.

UIView *viewToSpin = ...;  
CABasicAnimation* spinAnimation = [CABasicAnimation 
            animationWithKeyPath:@"transform.rotation"]; 
spinAnimation.toValue = [NSNumber numberWithFloat:5*2*M_PI]; 
[viewToSpin.layer addAnimation:spinAnimation forKey:@"spinAnimation"]; 
+0

Jak mogę spowolnić tę animację? – mahboudz

+0

Aby zapoznać się z uwarunkowaniami czasowymi animacji, zapoznaj się z materiałem referencyjnym dla protokołu CAMediaTiming, który wdraża program CABasicAnimation. W szczególności, prawdopodobnie chcesz ustawić właściwość "duration". Powyższy kod używa domyślnego czasu trwania 0,25 sekundy. –

1

Pierwsze ciągły efekt wirowania jest trochę trudne, ale opisują sposoby, aby to zrobić here. Tak, Core Animation wydaje się optymalizować transformację do najbliższej pozycji końcowej w kręgu jednostek. Metoda, którą tutaj opisuję, łączy ze sobą kilka animacji półobrotowych, aby wykonać pełne obroty, chociaż zauważysz lekkie zająknięcie podczas przekazywania z jednej animacji do drugiej.

Być może CAKeyframeAnimation skonstruowany z tymi wartościami pół obrotu byłby właściwą drogą. Wtedy możesz również kontrolować przyspieszanie i zwalnianie.

6

Jak wskazał Brad Larson, można to zrobić za pomocą CAKeyframeAnimation. Na przykład,

CAKeyframeAnimation *rotationAnimation; 
rotationAnimation = 
    [CAKeyframeAnimation animationWithKeyPath:@"transform.rotation.z"]; 

rotationAnimation.values = [NSArray arrayWithObjects: 
          [NSNumber numberWithFloat:0.0 * M_PI], 
          [NSNumber numberWithFloat:0.75 * M_PI], 
          [NSNumber numberWithFloat:1.5 * M_PI], 
          [NSNumber numberWithFloat:2.0 * M_PI], nil]; 
rotationAnimation.calculationMode = kCAAnimationPaced; 
rotationAnimation.removedOnCompletion = NO; 
rotationAnimation.fillMode = kCAFillModeForwards; 
rotationAnimation.timingFunction = 
    [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut]; 
rotationAnimation.duration = 10.0; 

CALayer *layer = [viewToSpin layer]; 
[layer addAnimation:rotationAnimation forKey:@"rotationAnimation"]; 

można kontrolować czas całkowitego animacji z właściwością rotationAnimation.duration i przyspieszania i zwalniania (i obliczenia kroków pomiędzy nimi) z właściwością rotationAnimation.timingFunction.

1
CABasicAnimation* animation = [CABasicAnimation animationWithKeyPath:@"transform.rotation.z"]; 
animation.fromValue = [NSNumber numberWithFloat:0.0f]; 
animation.toValue = [NSNumber numberWithFloat: 2*M_PI]; 
animation.duration = 8.0f; 
animation.repeatCount = INFINITY; 
[self.myView.layer addAnimation:animation forKey:@"SpinAnimation"];