2012-07-12 9 views
5

Desidero poter utilizzare una UIViewAnimationCurve per le rotazioni e un'altra per le modifiche di posizione. È possibile?Utilizzare due UIViewAnimationCurves diversi nella stessa animazione

Ad esempio (in pseudo codice);

// Begin animations 

// Set rotation animation curve to EaseInOut 

// Set position animation curve to Linear 

// Make some changes to position 

// Make some change to the angle of rotation 

// Commit the animations 

EDIT: (approccio CAAnimationGroup suggerito qui di seguito) - hanno creato 2 CABasicAnimations separati e un CAAnimationGroup comunque le animazioni non sono di partenza. Qualche idea?

CABasicAnimation *postionAnimation = [CABasicAnimation animationWithKeyPath:@"position"]; 
postionAnimation.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionLinear]; 
postionAnimation.toValue = [NSValue valueWithCGPoint:[self transformPointToWorldSpaceFromViewSpace:self.spriteView.position]]; 
postionAnimation.delegate = self; 

CABasicAnimation *rotationAnimation = [CABasicAnimation animationWithKeyPath:@"transform.z"]; 
rotationAnimation.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut]; 
rotationAnimation.toValue = [NSNumber numberWithFloat:self.spriteView.angle -= M_PI_2]; 
rotationAnimation.delegate = self; 

CAAnimationGroup *animationsGroup = [CAAnimationGroup animation]; 
animationsGroup.duration = self.clockSpeed; 
animationsGroup.animations = [NSArray arrayWithObjects:postionAnimation, rotationAnimation, nil]; 

// Perform the animation 
[self.spriteView.layer addAnimation:animationsGroup forKey:nil]; 

risposta

3

La cosa migliore è quella di utilizzare più chiamate a animateWithDuration: ritardo: per mangiare: animazioni: completamento :. Usa una curva di animazione diversa per ogni chiamata e funzioneranno in parallelo. Oppure, con diversi valori di ritardo, è possibile eseguirli in sequenza.

Il codice potrebbe essere simile:

[UIView animateWithDuration: .5 
    delay: 0 
    options: UIViewAnimationOptionCurveEaseInOut 
    animations: ^{ 
    view1.center = CGPointMake(x, y); 
    } 
    completion: ^{ 
    //code that runs when this animation finishes 
    } 
]; 

[UIView animateWithDuration: .5 
    delay: .5 
    options: UIViewAnimationOptionCurveLinear 
    animations: ^{ 
    view2.center = CGPointMake(x2, y2); 
    } 
    completion: ^{ 
    //code that runs when this animation finishes 
    } 
]; 

Se si utilizza CAAnimationGroups, ci sono diversi problemi.

Innanzitutto, il gruppo di animazione determina la curva di animazione per l'intero gruppo. Non penso che sia possibile specificare curve diverse per ogni animazione secondaria (anche se confesso di non averlo provato)

In secondo luogo, se si aggiungono animazioni a un gruppo, i delegati alle singole animazioni non ottengono chiamato. Vengono richiamati solo i metodi delegati del gruppo di animazione.

+0

Questo è un ottimo consiglio, grazie Duncan. Ci proveremo domani. Dave –

+0

Ciao Duncan, fatto questo e funziona un piacere! L'unica domanda che ho è, va bene chiamare il mio metodo [self transformPointToViewSpaceFromWorldSpace: self.spriteView.position] all'interno del blocco? Funziona e gli strumenti non mostrano alcuna perdita, tuttavia ricordo vagamente qualcosa sull'uso di sé all'interno dei blocchi. Grazie ancora, Dave. –

4

Provare a creare due diverse animazioni. Con il metodo di UIView non è possibile impostare animazioni diverse Curve per le diverse proprietà dell'animazione. Oppure puoi divertirti con CAAnimations e creare un CAAnimationGroup in cui hai impostato i tuoi due CABasicAnimation

+0

Grazie a iSofTom, ho provato questo approccio (vedi modifica in questione) ma secondo i metodi dei delegati le mie animazioni non iniziano. Qualche idea? –

0

Ok, finalmente risolto. Grazie per la direzione iSofTom (hai votato la tua risposta). Avevo impostato i delegati delle singole animazioni ma non il gruppo.

CABasicAnimation *postionAnimation = [CABasicAnimation animationWithKeyPath:@"position"]; 
postionAnimation.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionLinear]; 
postionAnimation.fromValue = [NSValue valueWithCGPoint:self.spriteView.center]; 
postionAnimation.toValue = [NSValue valueWithCGPoint:[self transformPointToViewSpaceFromWorldSpace:self.spriteView.position]]; 

CABasicAnimation *rotationAnimation = [CABasicAnimation animationWithKeyPath:@"transform.rotation.z"]; 
rotationAnimation.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut]; 
rotationAnimation.fromValue = [NSNumber numberWithFloat:self.spriteView.angle]; 
rotationAnimation.toValue = [NSNumber numberWithFloat:self.spriteView.rotation]; 

CAAnimationGroup *animationsGroup = [CAAnimationGroup animation]; 
animationsGroup.duration = self.clockSpeed; 
animationsGroup.animations = [NSArray arrayWithObjects:postionAnimation, rotationAnimation, nil]; 
animationsGroup.delegate = self; 
// Perform the animation 
[self.spriteView.layer addAnimation:animationsGroup forKey:nil]; 

e

- (void)animationDidStart:(CAAnimation *)theAnimation { 
radiansToDegrees(self.spriteView.rotation)); 
    self.spriteView.angle = self.spriteView.rotation; 

NSStringFromCGPoint(self.spriteView.position)); 
    self.spriteView.center = [self transformPointToViewSpaceFromWorldSpace:self.spriteView.position]; 
}