2011-02-14 8 views
6

Sto utilizzando willRotateToInterfaceOrientation per scambiare le visualizzazioni quando il mio iPad ruota. Se ho una vista modale o una vista di avviso aperta quando il mio dispositivo ruota e scambia le viste, la vista cambia e l'avviso scompare e non riappare, anche se l'avviso viene "presentato" più tardi.Come posso evitare la scomparsa di una vista modale quando si ruota su iPad?

Modifica: Ho ristretto questo problema un po '. Quando viene presentata una vista modale con UIModalPresentationFullScreen, la vista modale "sopravvive" alle rotazioni.

Cosa posso fare per risolvere questo problema?

Qui è la mia realizzazione di willRotateToInterfaceOrientation:

- (void) willRotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration{ 

[super willRotateToInterfaceOrientation:toInterfaceOrientation duration:duration]; 

// 
// Load an alternate view depending on the orientation 
// 


if (toInterfaceOrientation == UIInterfaceOrientationLandscapeLeft) { 

    [UIView beginAnimations:@"" context:nil]; 
    [self setView:theLandscapeView]; 
    self.view.bounds = CGRectMake(0, 0, 1024, 768); 
    self.view.transform = CGAffineTransformMakeRotation(kDegreesToRadians * (-90)); 
    [UIView commitAnimations];  

}else if (toInterfaceOrientation == UIInterfaceOrientationLandscapeRight) { 

    [UIView beginAnimations:@"" context:nil]; 
    [self setView:theLandscapeView]; 
    self.view.bounds = CGRectMake(0, 0, 1024, 768); 
    self.view.transform = CGAffineTransformMakeRotation(kDegreesToRadians * (90)); 
    [UIView commitAnimations]; 

}else if (toInterfaceOrientation == UIInterfaceOrientationPortrait) { 

    [UIView beginAnimations:@"" context:nil]; 
    [self setView:thePortraitView]; 
    self.view.transform = CGAffineTransformMakeRotation(kDegreesToRadians * (0)); 
    self.view.bounds = CGRectMake(0, 0, 768, 1024); 
    [UIView commitAnimations]; 

}else if (toInterfaceOrientation == UIInterfaceOrientationPortraitUpsideDown) { 

    [UIView beginAnimations:@"" context:nil]; 
    [self setView:thePortraitView]; 
    self.view.transform = CGAffineTransformMakeRotation(kDegreesToRadians * (180)); 
    self.view.bounds = CGRectMake(0, 0, 768, 1024); 
    [UIView commitAnimations]; 
} 
} 
+0

Grazie. Per ora sto lavorando senza scambiare le viste, ma questa non è una soluzione ... – Moshe

+0

Sì, non ho mai riscontrato questo problema, ma semplicemente perché ridimensiono le visualizzazioni solo cambiando l'orientamento, piuttosto che sostituirle . Sarebbe possibile presentare la pagina modale da una vista di hosting trasparente, ma i tuoi contenuti dovrebbero essere in una sottoview di ciò che è stato cambiato nel cambiamento di orientamento? –

+0

@BradLarson - Grazie per dare un'occhiata. Penso che il tuo suggerimento funzionerebbe, ma è leggermente inefficiente, perché devi caricare una vista aggiuntiva (controller). Per ora sto aspettando che Apple risponda a questa domanda e sto ridimensionando manualmente, ecc. Volevo evitarlo perché UIImageViews non si comporta troppo bene. – Moshe

risposta

2

Se fossi soluzione di questo problema, vorrei fare una delle seguenti

  1. Aggiungere il punto di vista alternativo a una vista primaria, e non modificare la proprietà della vista
  2. Creare un disegno per le viste che non richiede uno scambio di viste complete, ma riorganizza o nasconde i sottoelementi della vista.
  3. presenta alcun modale dalla ViewController radice della gerarchia

avrei lavorare molto difficile non scambiare la visione interamente per motivi di orientamento. Sembra qualcosa che continuerà a presentare problemi anche dopo aver risolto questo.

0

Se si scambiano le viste, si dovrebbe anche scambiare le visualizzazioni modali.

Ad esempio, se si presenta il controller popover, verrà automaticamente chiuso e quindi visualizzato con la rotazione dell'interfaccia utente.

0

Ecco un'idea: mantieni costante la vista principale, ma modifica la vista secondaria nella vista orizzontale o verticale. qualcosa di simile:

- (void) willRotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration{ 

    [super willRotateToInterfaceOrientation:toInterfaceOrientation duration:duration]; 

    // Remove the current subview from the main view 
    if (self.view.subviews.count) { 
     [self.view.subviews objectAtIndex:0] removeFromSuperview]; 
    } 

    // Use your if-else block, but change [self setView:] for [self.view addSubview:] 
} 

Così ora quando si crea il modale, esso sarà collegato al controller, che ora ha una vista principale costante.

Nota che non l'ho provato, visto che sto riprendendo la codifica dopo due settimane di pausa ... Buona fortuna!

Problemi correlati