2012-03-23 6 views
7

Contesto: sto tentando di eseguire un'animazione personalizzata da un normale UIViewController.view a un UISplitViewController.view. L'animazione dovrebbe mostrare da sinistra a destra.iOS: animazione dell'orientamento errato su rootViewController?

I set self.window.rootViewController = viewController dove viewController è un normale UIViewController.

Una volta che il colpo utente, il seguente viene chiamato:

UIView *theWindow = [viewController.view superview]; 

[viewController.view removeFromSuperview]; 
[theWindow addSubview:self.splitViewController.view]; 


CATransition *animation = [CATransition animation]; 
[animation setDuration:0.5]; 
[animation setType:kCATransitionPush]; 
[animation setSubtype:kCATransitionFromLeft]; 
[animation setTimingFunction:[CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut]]; 

[[theWindow layer] addAnimation:animation forKey:@"SwitchToView1"]; 

Quando il dispositivo è in modalità ritratto, tutto è andato alla perfezione. Tuttavia, quando il dispositivo si trova in modalità orizzontale, l'animazione della transizione viene eseguita come se il dispositivo fosse ancora in modalità verticale. Ad esempio: invece di entrare da sinistra, arriva dal basso. L'orientamento di entrambe le viste è completamente corretto. Solo la transizione è strana.

+0

Se si ruota in orizzontale nella direzione opposta, non l'animazione avviene dall'alto? O è dal basso indipendentemente dal modo in cui si passa in modalità orizzontale? La costante porta l'animazione dal lato sinistro del livello. Mi chiedo se la cornice del livello non viene aggiornata, quindi quale era il lato sinistro del livello è ora in basso dopo la rotazione. – jmstone617

+0

Questo è corretto. L'animazione ignora qualsiasi cambiamento di orientamento. Qualche suggerimento su come assicurarsi che il layer venga aggiornato? – Byte

+0

Ho lo stesso problema: l'orientamento del CALayer non sembra corrispondere alla sua vista. Sembra che ci siano altri post simili a riguardo, ma nessuna delle soluzioni sembra funzionare per me. Ruotando il livello di 90 gradi naturalmente si ruota anche la vista, quindi non aiuta .. – jonydep

risposta

9

Quindi, ho giocato con il tuo codice (ho fatto una ricostruzione migliore di come hai impostato il tuo progetto), e sono stato in grado di ottenere l'effetto desiderato con il seguente codice. Ho provato a impostare i fotogrammi e i limiti dei livelli, delle viste o dei sottolivelli, ecc. E nessuno di questi ha funzionato. Anche CATransform3D's, CATransform3Directory, ecc. Non stavano facendo il trucco. Ho anche cercato su google per un'ora solida. Nessuno ha avuto il tuo problema, o nessuno ha risolto il tuo problema. Indipendentemente da ciò, questa soluzione funziona, e meno che qualche guru Core Animation in grado di fornire una soluzione migliore, sei il benvenuto a questo:

- (void)swipeGesture:(UISwipeGestureRecognizer *)sender { 

UIView *theWindow = [self.viewController.view superview]; 

UIInterfaceOrientation interfaceOrientation = self.viewController.interfaceOrientation; 
NSString *subtypeDirection; 
if (interfaceOrientation == UIInterfaceOrientationLandscapeLeft) { 
    subtypeDirection = kCATransitionFromTop; 
} 
else if (interfaceOrientation == UIInterfaceOrientationLandscapeRight) { 
    subtypeDirection = kCATransitionFromBottom; 
} 
else { 
    subtypeDirection = kCATransitionFromLeft; 
} 

[self.viewController.view removeFromSuperview]; 
[theWindow addSubview:self.splitViewController.view]; 

CATransition *animation = [CATransition animation]; 
[animation setDuration:0.5]; 
[animation setType:kCATransitionPush]; 
[animation setSubtype:subtypeDirection]; 
[animation setTimingFunction:[CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut]]; 

[[theWindow layer] addAnimation:animation forKey:@"SwitchToView1"]; 
} 
+0

Questa soluzione funziona, anche se spero che non si arrivi a questo (aggiusta manualmente la transizione). Ho altre animazioni che dipendono dall'orientamento della finestra che non si applica a questo. A meno che non venga una soluzione migliore, segnerò la tua risposta prima che la ricompensa sia finita. Grazie. – Byte

+1

Capito. Mi dispiace non averti potuto fornire una soluzione migliore. Ho creato un progetto di esempio e ho trascorso 3 ore buone su questo ieri cercando di trovare qualcosa. L'idea è semplice: aggiorna la cornice del livello della finestra in modo che corrisponda all'orientamento del livello della vista iniziale. Purtroppo, metterlo in pratica non sembra così semplice. – jmstone617

+0

Ho ragione nel pensare che questo seleziona solo la direzione corretta per la transizione? Non aggiusta ancora le dimensioni della "cornice" della transizione? – jonydep