2009-02-05 12 views
16

Sto cercando di ruotare un po 'UIView attorno al suo centro, in modo che il semplice codice va qualcosa come (in pseudocodice):ruotare un UIView attorno al suo centro, ma più volte

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

ora se ho impostato angolo dite M_PI/2 che la cosa ruota bene. se l'ho impostato su 2 * M_PI, beh, fa "niente". Posso capire che la matrice si traduce in qualcosa che non fa nulla (ruotare di 360 significa "rimanere" in un certo senso), ancora, voglio ruotarlo 5 volte (pensate a una scala di giornale ruotata a vostro effetto - io sono non è bravo a descrivere, spero che qualcuno capisca). Quindi, ho provato ad aggiungere l'angolo di impostazione a 180 gradi (M_PI) e aggiungere uno animatationBlock nidificato. ma suppongo che dal momento che sto impostando la stessa proprietà (someview.transition) di nuovo lo ignori in qualche modo). Ho provato a impostare il conteggio delle ripetizioni dell'animazione su 2 con angolo M_PI ma sembra semplicemente ruotare 180, tornare alla posizione diritta e quindi iniziare di nuovo la rotazione.

Quindi, sono un po 'fuori di idee, qualsiasi aiuto apprezzato! --t

+0

si può anche cominciare da qui: https://github.com/jonasschnelli/UIView-i7Rotate360 molto facile da implementare e cambiamento. –

+0

possibile duplicato di [UIView Infinite 360 ​​gradi rotation animation?] (Http://stackoverflow.com/questions/9844925/uiview-infinite-360-degree-rotation-animation) –

risposta

36

È possibile utilizzare l'animazione seguente nella proprietà del livello di UIView. L'ho provato

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

Come posso rallentare questa animazione? – mahboudz

+0

Per le considerazioni sul tempo di animazione, consultare il materiale di riferimento per il protocollo CAMediaTiming, che implementa CABasicAnimation. In particolare, probabilmente vorrai impostare la proprietà 'duration'. Il codice sopra utilizza la durata predefinita di 0,25 secondi. –

1

Ottenere un effetto di rotazione continua è un po 'difficile, ma mi descrivono un mezzo per farlo here. Sì, Core Animation sembra ottimizzare le trasformazioni fino alla posizione finale più vicina all'interno del cerchio unitario. Il metodo che descrivo qui mette insieme alcune animazioni a mezza rotazione per fare rotazioni complete, anche se notate una leggera balbuzie nel trasferimento da un'animazione all'altra.

Forse una CAKeyframeAnimazione costruita con questi valori di semirotazione sarebbe la strada giusta da percorrere. Quindi puoi anche controllare l'accelerazione e la decelerazione.

6

Come indicato da Brad Larson, è possibile farlo con uno CAKeyframeAnimation. Ad esempio,

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"]; 

È possibile controllare la durata dell'animazione totale con la proprietà rotationAnimation.duration, e l'accelerazione e decelerazione (e calcolo delle fasi intermedie) con la proprietà 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"]; 
Problemi correlati