2010-08-12 12 views
8

Sto animando un pendolo che oscilla da 0 gradi a 200 gradi massimi e poi di nuovo indietro. Il problema è che se il pendolo supera i 180 gradi, torna a 0 per il percorso più breve che deve continuare in senso orario. E mi piacerebbe che andasse in senso antiorario. Ecco il mio codice: ('destra' è un valore booleano che è vero quando il pendolo sta oscillando da sinistra a destra)Rotazione in senso orario/antiorario per un CABasicAnimazione di un UIImageView

- (void)swingPendulum { 
    CABasicAnimation *rotationAnimation; 
    rotationAnimation = [CABasicAnimation animationWithKeyPath:@"transform.rotation.z"]; 
    if (right) 
     rotationAnimation.toValue = [NSNumber numberWithFloat:degreesToRadians(kMax)]; 
    else 
     rotationAnimation.toValue = [NSNumber numberWithFloat:degreesToRadians(kMin)];        
    rotationAnimation.duration = 1.0; 
    rotationAnimation.repeatCount = 1.0; 
    rotationAnimation.delegate = self; 
    rotationAnimation.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseIn]; 
    rotationAnimation.removedOnCompletion = NO; 

    [pendulum.layer addAnimation:rotationAnimation forKey:@"rotationAnimation"]; 
} 

Tutte le idee come posso fare questo lavoro? È l'ultimo tassello del mio puzzle con lo swingometro, che altrimenti funziona alla grande: D Grazie!

Michael

risposta

8

per farlo andare in senso antiorario, è sufficiente impostare x ad un valore negativo (aggiungere - di fronte) in cui si desidera

rotationAnimation.toValue = [NSNumber numberWithFloat:degreesToRadians(x)]; 
+0

Grazie per la risposta, ma non sembra fare la differenza, ho paura. Impostandolo su un valore -ive sembra proprio che l'animazione si spezzi alla fine ...Penso che forse dovrei dover riscriverlo per usare un NSTimer e animare la cosa fotogramma per fotogramma ... – Smikey

+0

In realtà, hai ragione - dal momento che kMin è attualmente impostato a -20, così che effettivamente fa oscillare il pendolo in senso antiorario, ma solo se non supera i 180 gradi. Se supera 180, indipendentemente dal valore impostato su (-180, -90, 90 ecc.), Continua sempre in senso orario, anche se non è la via più breve ... Altre idee? – Smikey

+1

AAAAH, se si imposta su un valore come -380, tuttavia, funziona. Non sono davvero sicuro del perché, ma ho appena aggiunto una condizione che cambia il valore di toValue a seconda che l'oscillazione iniziale passi o meno di 180 gradi. Grazie per tutto l'aiuto! – Smikey

0

io non so esattamente qual è il problema, ma se si utilizza funzionalità di inversione automatica del dell'animazione, probabilmente si può semplificare questo e farla ruotare (altalena) avanti e indietro. Questo funziona per me:

CABasicAnimation* rotationAnimation = 
      [CABasicAnimation animationWithKeyPath:@"transform.rotation.z"]; 
[rotationAnimation setToValue:[NSNumber numberWithFloat:DegreesToRadians(200.0)]]; 
[rotationAnimation setDuration:1.0]; 
[rotationAnimation setRepeatCount:HUGE_VALF]; // Repeat forever 
[rotationAnimation setAutoreverses:YES]; // Return to starting point 

[[pendulum layer] addAnimation:rotationAnimation forKey:nil]; 
+0

Una buona idea, ma l'oscillazione inversa non è un'inversione esatta dello swing avanti. Cioè l'oscillazione in avanti inizia da 0, ma l'oscillazione inversa torna a -20. Quindi preferirei chiamare una funzione che la oscilla dalla sua trasformazione corrente a un angolo specifico. Non sto cercando di creare un pendolo esattamente, bensì uno swingometro di tipo da golf: il giocatore lo ferma una volta per la potenza e ancora una volta verso il basso per la precisione. Funziona perfettamente a meno che la barra non superi i 180 gradi durante la salita, dopo di che andrà avanti in senso antiorario a 0, piuttosto che in retromarcia .. Quindi ho bisogno di forzare è in qualche modo – Smikey

1

impostazione provare qualcosa di simile

rotationAnimation.valueFunction = [CAValueFunction functionWithName:kCAValueFunctionRotateZ]; 

Utilizzando valore funzioni di trasformare, animazioni possono effettuare la proprietà transform di un livello utilizzando le trasformazioni arbitrarie di ogni componente (senza normalizzazione a 360 °) e concatenano normalmente quando vengono applicate più animazioni contemporaneamente.

Si utilizza una funzione di trasformazione del valore che ruota da 0 ° a 180 ° attorno all'asse z creando una funzione CAValueTransform specificando kCAValueFunctionRotateZ e quindi creando un'animazione con un valore compreso tra 0, un valore di M_PI e impostando il valore di valore di animazione Trasforma la proprietà nel valore trasforma l'istanza.

+0

Grazie. Sono un po 'riluttante a cambiare l'approccio che sto già usando, a meno che non ci sia modo di risolverlo, dal momento che ho un sacco di altri codici che si basano sui metodi che ho già usato. Come detto sopra, in realtà sto creando uno swingometro di tipo golf-game, piuttosto che un pendolo, quindi in qualsiasi momento l'utente può interrompere lo swing durante la salita (per determinare la potenza) e oscilla all'indietro, così l'utente può interrompere nuovamente (per determinare l'accuratezza). Ho tutte queste funzionalità, a parte il fatto che se l'utente fa oscillare la barra di 180 gradi, non oscilla indietro, anzi va avanti. – Smikey

+0

Provare ad impostarlo e vedere se funziona? Ho l'impressione che dovrebbe. –

+0

L'ho fatto - ha iniziato a comportarsi in modo strano ... Avrò un po 'più di violino e tornerò! – Smikey

1

io penso che si debba usare questo codice:

[rotationAnimation.byValue = [NSNumber numberWithFloat:degreesToRadians(kMax/2))]; 
[rotationAnimation.toValue = [NSNumber numberWithFloat:degreesToRadians(kMin)]; 
Problemi correlati