2013-03-17 7 views
7

Sto provando a creare un'animazione nella mia app iOS in cui una nuova vista scorre sullo schermo da sinistra mentre la vista principale scorre a destra per fare spazio. La vista principale è una sottoview della vista superiore del mio controller di visualizzazione e la vista laterale che scorre è caricata da un file xib separato.Cercando di animare due UIViews contemporaneamente, solo una mossa

Nel caso in cui sia rilevante, ecco il mio codice per caricare la vista laterale, chiamato dal metodo viewDidLoad mio principale del controller della vista:

sideViewController = [[SideViewController alloc] init]; 
[sideViewController loadView]; 

sideView = sideViewController.topView; 
[self.view addSubview:sideView]; 
sideView.hidden = YES; 
sideView.frame = CGRectMake(-200, 0, 200, 460); 

Ed ecco il codice che viene chiamato ad animare i due punti di vista:

sideView.hidden = NO; 
[UIView animateWithDuration:0.25f 
       animations:^{       
        mainView.frame = CGRectMake(200, 0, 320, 460); 
        sideView.frame = CGRectMake(0, 0, 200, 460); 
       }]; 

Questo sembra abbastanza semplice. Ma per qualche ragione, solo sideView animates - mainView non si muove da nessuna parte. E per rendere le cose ancora più confuse, se commento la riga nel blocco di animazione che sposta sideView, l'animazione per mainView inizia a funzionare.

Qualcuno sa cosa c'è che non va? Da tutte le ricerche e i documenti che ho letto, quello che sto facendo dovrebbe funzionare bene. Quello che pensavo sarebbe stata una semplice animazione si è trasformato in ore di frustrazione. Qualsiasi aiuto sarebbe molto apprezzato!

Edit:

Andando fuori del suggerimento di Guo Luchuan ho cercato animare diverse proprietà dei due UIViews. La maggior parte ha ottenuto lo stesso risultato, anche se l'animazione di entrambe le proprietà di trasformazione ha funzionato quasi a. In quel caso sono state animate entrambe le animazioni, ma la schermata principale ha fatto solo la cosa sbagliata: la sua animazione è iniziata con essa in una posizione diversa e si è conclusa nel posto sbagliato. Sembra come se fosse l'esecuzione della traduzione ho dato istruzioni a fare, ma a partire da questa posizione espressa nei calcoli vettoriali:

starting_point - 0.5 * total_translation 

che significa che fino alle ore:

starting_point + 0.5 * total_translation 

La vista laterale, invece, anima in modo corretto.

Questo è dannatamente fastidioso. Non mi rendevo conto che le animazioni performanti su iOS in questo modo erano così infrante. La prossima cosa che proverò è l'utilizzo di CABasicAnimation, anche se non sono felice di dover ricorrere a un API di livello così basso per qualcosa di così semplice.

risposta

3

Il problema era che avevo attivato l'autoresize per i miei file xib. Non appena l'ho spento, il mio codice di animazione originale funzionava perfettamente.

+0

Ho avuto lo stesso problema e ho attivato anche AutoLayout. Disattivarlo non mi ha aiutato purtroppo .... anche se forse mi sono perso il luogo in cui lo spegni globalmente (sto costruendo i miei schermi con il codice). Una soluzione che ho trovato è stata incorporare entrambe le viste in una vista contenitore genitore e animare solo quella. – avance

4

Ho incontrato lo stesso problema come te.

Quando si imposta 2 viste stessa proprietà (come frame o transform) allo stesso tempo, nel UIView animation block, non funzionerà per quello che mi aspetto.

Quindi, ho impostato una vista frame e impostato un'altra vista transform, quindi funziona bene, ma non so perché sarà quello.

Penso che funzionerà bene per voi.

sideView.hidden = NO; 
[UIView animateWithDuration:0.25f 
       animations:^{       
        mainView.frame = CGRectMake(200, 0, 320, 460); 
        sideView.transform = CGAffineTransformMakeTranslation(200,0); 
       }]; 

e penso che si può fare 2 CABasicAnimation e quindi aggiungerli nel CAAnimationGroup.Anche può funzionare per voi

+0

Questo è un ottimo suggerimento, anche se ho fatto un tentativo e non ha funzionato. In realtà ho provato ad animare diverse combinazioni di attributi e ho ottenuto lo stesso risultato o un risultato sbagliato diverso. Ho intenzione di modificare il mio post principale per approfondire i dettagli. – GuyGizmo

0

Se il sideView è un visualizzazione secondaria di mainView, utilizzare questo metodo di animazione:

+animateWithDuration:delay:options:animations:completion: 

con l'opzione:

UIViewAnimationOptionAllowAnimatedContent 
+0

sideView e mainView sono fratelli sotto la vista superiore del mio controller di visualizzazione, quindi questo non dovrebbe essere applicato. Tuttavia, la cosa strana è che sideView sta chiaramente influenzando mainView in qualche modo strano che non capisco, quindi ho provato ad usare comunque questa opzione, ma non ha fatto alcuna differenza. – GuyGizmo

+0

Scusa, ho letto il tuo Q sbagliato. Se sono fratelli, non so cosa ti sta succedendo. – Tricertops

0

ho finalmente trovato una soluzione, e Penso che sia piuttosto atroce. Ecco il codice che funziona:

mainView.transform = CGAffineTransformMakeTranslation(400,0); 
CABasicAnimation *move = [CABasicAnimation animationWithKeyPath:@"transform.translation.x" ]; 
[move setFromValue:[NSNumber numberWithFloat:200]]; 
[move setToValue:[NSNumber numberWithFloat:400]]; 
[move setDuration:0.25]; 
move.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut]; 
[[mainView layer] addAnimation:move forKey:@"transform.translation.x"]; 

sideView.center = CGPointMake(100, 230); 
CABasicAnimation *sideMove = [CABasicAnimation animationWithKeyPath:@"transform.translation.x" ]; 
[sideMove setFromValue:[NSNumber numberWithFloat:-200]]; 
[sideMove setToValue:[NSNumber numberWithFloat:0]]; 
[sideMove setDuration:0.25]; 
sideMove.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut]; 
[[sideView layer] addAnimation:sideMove forKey:@"transform.translation.x"]; 

In primo luogo, se non ho impostato il trasformare MainView, tutta questa cosa non avrebbe funzionato e il MainView non si sarebbe mosso da nessuna parte, dopo l'animazione è stata fatta. Ho provato a impostare la sua cornice e il centro, ma nessuno dei due ha avuto alcun effetto. Trasforma solo lavorato. Questo dettaglio è simile all'utilizzo del metodo animateWithDuration.

Secondo, e questa è la parte che mi ha più confuso, perché i numeri sono quelli che sono? Per qualsiasi motivo, avevo bisogno di spostare il mainView di 200 pixel in più a destra (la larghezza di sideView) per farlo allineare correttamente. Se non lo facessi, si animerebbe esattamente dove prima, anche se stavo cambiando la sua trasformazione affine dall'identità a una traduzione di 200 pixel a destra.

Vicino come posso dire, Sideview sta interessando MainView in qualche modo strano, anche se sono fratelli direttamente sotto vista dall'alto livello di mio controller della vista, e non dovrebbe avere alcun tipo di rapporto gerarchico. La mia ipotesi è che questo abbia qualcosa a che fare con il caricamento di sideView da uno xib, ma per quanto posso dire, lo sto facendo correttamente.

Speriamo che questa soluzione sia utile per qualcun altro che si trova in una situazione simile, e non dovranno fare la stessa noiosa programmazione di pollo morto che ho appena fatto.

Inoltre, se qualcuno può offrire una spiegazione per tutto questo, sarei molto riconoscente! Non mi piace codificare cose che non capisco, e mi piacerebbe sapere perché tutto questo è accaduto in modo da poter evitare situazioni come questa in futuro.

+1

La vera Q è, ** perché ** non ha funzionato nel modo più semplice? Se puoi dirmi qualcosa in più: da dove si chiama l'animazione? Stai usando l'autoresizing o il layout automatico nel codice e XIB? – Tricertops

+2

Oh mio dio, l'intero problema era che avevo attivato l'autolayout. Questa non è la prima volta che ho commesso questo errore, ma l'ho dimenticato fino a quando non l'hai menzionato. L'ho appena spento su entrambi i miei file xib e tutto ad un tratto AnimateWithDuration funziona perfettamente. Ore del mio tempo sono state semplicemente perse a causa di quella caratteristica, e non c'era alcuna indicazione che fosse il colpevole. – GuyGizmo

+0

Sì, quando si utilizza il layout automatico, non si modificano direttamente i frame. Non ho provato le animazioni in Layout automatico, ma forse puoi animare la 'costante' di vincoli. – Tricertops