2010-01-22 22 views
5

Ho notato che ottengo l'orientamento molto intermittente sul mio dispositivo & del simulatore.Orientamento molto intermittente su dispositivo e simulatore

Ho un controller di visualizzazione modale che presento, ed è l'unica cosa nella mia app che supporta la rotazione.

Se lancio l'app in verticale senza spostare il dispositivo, apro il VC modale e quindi ruoto il dispositivo, di solito funziona. Tuttavia a volte se apro l'app tenendo il dispositivo in orizzontale, quindi ruoto a verticale, avvio il VC e quindi ruotare il dispositivo, non si verifica alcuna rotazione. Sembra molto intermittente. A volte, se apro l'app in modalità verticale e poi apro il VC e ruoto il dispositivo, non accade nulla, e finché non esco e non lo riavvio non si verifica alcun orientamento nell'app.

È strano perché il 50% delle volte funziona! Ogni volta che lo lancio tramite Xcode e definisco i breakpoint in shouldAutorotateToInterfaceOrientation, funziona sempre!

Chiunque ha mai avuto questo o sa cosa sta succedendo?

+0

Nessuna idea specifica che cosa c'è che non va, ma ho pensato di chiedere quello che mi chiedo sempre quando qualcosa di strano sta accadendo nell'interfaccia utente: "Sei chiamando nulla in UIKit al di fuori del thread principale" – lawrence

+0

Grazie per il commento. No, sono sicuro che non lo farò! È tutto molto sconcertante. –

+0

Questo comportamento si verifica solo nella tua app o vedi che si comporta in modo anomalo anche in altre app? – Jasarien

risposta

-1

Anche se si tenta di avviare l'applicazione in modalità orizzontale, il telefono verrà avviato in verticale e quindi in orizzontale a seconda della posizione del telefono.

Non so quale codice si sta utilizzando per realizzare questo. Di seguito è riportato uno che è tratto da frammenti di codice di Apple. Vedere se questo può aiutare

- (void)willAnimateRotationToInterfaceOrientation:(UIInterfaceOrientation) 
interfaceOrientation duration:(NSTimeInterval)duration {  
    if (interfaceOrientation == UIInterfaceOrientationPortrait) 
    { 
     self.view = self.portrait; 
     self.view.transform = CGAffineTransformIdentity; 
     self.view.transform = CGAffineTransformMakeRotation(degreesToRadian(0)); 
     self.view.bounds = CGRectMake(0.0, 0.0, 300.0, 480.0); 
    } 
    else if (interfaceOrientation == UIInterfaceOrientationLandscapeLeft) 
    { 
     self.view = self.landscape; 
     self.view.transform = CGAffineTransformIdentity; 
     self.view.transform = CGAffineTransformMakeRotation(degreesToRadian(-90)); 
     self.view.bounds = CGRectMake(0.0, 0.0, 460.0, 320.0); 
    } 
    else if (interfaceOrientation == UIInterfaceOrientationPortraitUpsideDown) 
    { 
     self.view = self.portrait; 
     self.view.transform = CGAffineTransformIdentity; 
     self.view.transform = CGAffineTransformMakeRotation(degreesToRadian(180)); 
     self.view.bounds = CGRectMake(0.0, 0.0, 300.0, 480.0); 
    } 
    else if (interfaceOrientation == UIInterfaceOrientationLandscapeRight) 
    { 
     self.view = self.landscape; 
     self.view.transform = CGAffineTransformIdentity; 
     self.view.transform = 
     CGAffineTransformMakeRotation(degreesToRadian(90)); 
     self.view.bounds = CGRectMake(0.0, 0.0, 460.0, 320.0); 
    } 
} 
+0

Grazie per la risposta. Questo sembra essere un codice da scambiare tra due viste verticali e orizzontali separate. Sto semplicemente permettendo la rotazione di una singola vista, semplicemente restituendo SÌ nel metodo shouldAutorotateToInterfaceOrientation. –

0

Ho avuto problemi analoghi ottenere l'autorotazione per funzionare correttamente per controller di vista il cui genitore vista controllori non AutoRotate, anche se la maggior parte della mia esperienza è relativa a litigare UINavigationController al contrario di modale vista controllori. Eppure, io consiglio di provare il seguente:

  1. chiamata presentModalViewController: sulla parte superiore controller di vista di livello nella gerarchia, piuttosto che un viewController più profondo.

  2. Se questo non lo risolve, provare sottoclasse il controller alto livello di vista, e ignorando la sua shouldAutorotateToInterfaceOrientation: a guardare qualcosa di simile:

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation { 
    if (self.modalViewController) { 
     return [self.modalViewController shouldAutorotateToInterfaceOrientation:interfaceOrientation]; 
    } 
    return [super shouldAutorotateToInterfaceOrientation:interfaceOrientation]; 
} 
1

Dal momento che come lei ha ricordato "intermittente", direi che ha qualcosa a che fare con quello che stai facendo dopo la rotazione.

Per trovare il bug, suggerisco di rimuovere qualsiasi codice dopo la rotazione. Commenta qualsiasi attività di rete o operazioni OpenGL. Potrebbe anche aiutare a chiudere XCode e riaprirlo.

Se nulla aiuta, vorrei creare un nuovo progetto e iniziare a spostare i file uno per uno e testare.

+0

Sì, sicuramente penso che stia succedendo qualcosa di strano. Ho intenzione di rimuovere il codice fino a quando non funziona e sezionarlo in questo modo. Grazie per il suggerimento. –

0

Does chiamando

[[UIDevice currentDevice] beginGeneratingDeviceOrientationNotifications]; 

quando si mostra la visualizzazione aiuto rotazione-aware? (e probabilmente spegnendolo di nuovo quando lo si chiude?)

L'altra cosa che vorrei cercare è chiamate sospette a [UIWindow makeKeyWindow] o [UIResponder becomeFirstResponder].

Mi piacerebbe anche iscrivermi agli eventi UIDeviceOrientationDidChangeNotification e verificare che la vista Modale abbia ricevuto una chiamata a [UIViewController shouldAutorotateToInterfaceOrientation:] per ogni evento ricevuto.

+0

Grazie per l'aiuto. Proverò i suggerimenti e ti ricontatterò! –

0

ho finalmente scoperto quale fosse il problema!

Si scopre che solo il primissimo UIView aggiunto al proprio UIWindow verrà chiesto se ruotare o meno. Qualsiasi visualizzazione successiva non riceve questo messaggio. La mia app utilizzava un'altra vista per animare lontano dallo Default.png che viene visualizzato all'avvio e questo è stato aggiunto prima alla finestra!

Problemi correlati