2011-01-16 10 views
8

La mia app supporta solo l'orientamento orizzontale.La transizione animata non funziona correttamente nell'orientamento orizzontale

Sto provando a passare alla vista di un controller di visualizzazione, ma quando esegue l'animazione di transizione (come ad esempio il curl su), la vista viene ruotata di 90 gradi (quindi, il simulatore è ancora orientato in orizzontale, ma la vista appare ruotata di 90 gradi). Al termine della transizione, ruota verso l'orientamento corretto. Il mio codice è sotto

- (IBAction)buttonTouched 
{ 
    MyViewController *aViewController = [[MyViewController alloc] initWithNibName:NSStringFromClass([MyViewController class]) bundle:nil]; 

    [UIView transitionFromView:self.view 
         toView:aViewController.view 
         duration:2 
         options:UIViewAnimationOptionTransitionCurlUp 
        completion:NULL]; 
} 

Sembra come se la vista non ottenere il "orientamento è cambiato" la notifica, in modo che la presenta in verticale, e passa allo paesaggio dopo la fine dell'animazione. L'ho impostato in IB in modo che sia tutto disposto in orizzontale.

EDIT: Ho anche provato ad aggiungere un controller di visualizzazione al file IB di sé e la transizione a quella vista (pensando che forse era troppo vicino tra l'inizializzazione e la transizione) ma la stessa cosa è accaduta.

risposta

16

Bene, il motivo principale è che self.view (che attualmente "sa" di essere in landscape) viene sostituito con una nuova vista che non ha quell'informazione. Quindi, un pensiero è quello di mettere unViewController.view come una subView di self.view (assumendo che aViewController sia opaco). Ah, tu dici, ma poi perdo la bella animazione di transitionFromView. Beh, provate questo simpatia:

[UIView transitionWithView:self.view 
        duration:2 
        options:UIViewAnimationOptionTransitionCurlUp 
       animations:^{ 
        [self.view addSubview:aViewController.view]; 
       } 
       completion:NULL]; 

Se per qualche motivo che non funziona per voi, l'alternativa è quella di "insegnare" aViewController.view che è davvero una vista del paesaggio:

#define DEGREES_TO_RADIANS(__ANGLE__) ((__ANGLE__)/180.0 * M_PI) 
-(void)setNewViewToLandscape:(UIView*)viewObject { 
    //assumes self.view is landscape and viewObject is portrait 
    [viewObject setCenter:CGPointMake(self.view.frame.size.width/2,self.view.frame.size.height/2)]; 
    CGAffineTransform cgCTM = CGAffineTransformMakeRotation(DEGREES_TO_RADIANS(90)); 
    viewObject.transform = cgCTM; 
    viewObject.bounds = CGRectMake(0, 0, self.view.bounds.size.width, self.view.bounds.size.height); 
} 

MyViewController *aViewController = [[MyViewController alloc] initWithNibName:NSStringFromClass([MyViewController class]) bundle:nil]; 
[self setNewViewToLandscape:aViewController.view]; 

[UIView transitionFromView:self.view 
        toView:aViewController.view 
        duration:2 
        options:UIViewAnimationOptionTransitionCurlUp 
       completion:NULL]; 

One Un piccolo punto in più è che aViewController perde, quindi dovresti renderlo una proprietà mantenuta del controllore viewController.

+0

Wow ... ottima risposta. Grazie! – Ned

+0

Risposta davvero importante, ho salvato la giornata! – BootMaker

+0

Ho salvato anche la mia giornata, tuttavia c'è un piccolo errore di battitura nella seconda opzione: [self setViewToLandscape: aViewController.view]; dovrebbe essere: [self setNewViewToLandscape: aViewController.view]; usando la tua convenzione di denominazione. Inoltre, se il nuovo controller di visualizzazione è in orizzontale, basta scambiare larghezza e altezza qui: [viewObject setCenter: CGPointMake (self.view.frame.size.width/2, self.view.frame.size.height/2)]; (che lo renderà centrato correttamente. – Dado

Problemi correlati