2010-07-09 18 views
7

L'applicazione per iPhone mostra alcuni comportamenti strani quando viene eseguita sull'iPad in relazione alle modifiche di orientamento.Problema di modifica orientamento iPad

L'app si avvia con un controller di visualizzazione (chiamiamolo vista A per argomento) e il controller di navigazione, e shouldAutorotateToInterfaceOrientation restituisce SI per solo verticale. Sul controller di navigazione, spingo un controller di visualizzazione (vista B) che restituisce anche YES solo per il ritratto. Quindi, spingo un altro controller di visualizzazione (vista C) sul controller di navigazione che supporta tutte le rotazioni e regola le voci sullo schermo in base all'orientamento su cui ruotare.

Quando viene eseguito sul simulatore e sul dispositivo iPhone, se si ruota in orizzontale sulla vista C e quindi si tocca il pulsante Indietro per tornare alla vista B, fa la cosa giusta e sposta la vista B in modalità verticale. (Nel simulatore, ruota addirittura il simulatore di nuovo in verticale automaticamente.)

Il problema che sto riscontrando è che, quando eseguo esattamente la stessa sequenza di eventi sul simulatore e sul dispositivo iPad, la vista B che appare è non ruotato di nuovo in verticale, e il controller nav mostra ancora le informazioni per la vista C. Quindi, tocco il pulsante Indietro, e la vista rimane la stessa, ma il controller nav mostra normale per la vista B (ma tutto ancora in modalità orizzontale) . Quindi, se toccherò di nuovo il pulsante Indietro, la vista A appare sotto gli elementi della barra di navigazione della vista, e infine toccando indietro di nuovo metto sulla vista A con la barra di navigazione A elementi.

Se vado a visualizzare B sull'iPad e si inizia a ruotare, dovrebbeAutorotateToInterfaceOrientation si attiva con NO fino a quando non si raggiunge la modalità verticale, quindi si ritorna alla normalità.

L'applicazione è in fase di costruzione con l'ultima versione rilasciata dell'iPhone SDK e ha le impostazioni di generazione come segue: SDK di base di iPhone Simulator 4.0, dispositivo mirato Famiglia di iPhone, iPhone OS Obiettivo di distribuzione di iPhone OS 3.1.3.

Qualche idea?

+0

Ho esattamente lo stesso problema qui, e credo che sia un bug in iOS3.2. Sul mio iPhone (3.1.2 e 4.0) tutto come dovrebbe essere. Purtroppo non esiste una funzione (documentata) per modificare manualmente l'orientamento. Vediamo cosa hanno da dire gli altri qui ... – cocoapriest

risposta

4

di Apple afferma:

Case: All child view controllers in your UITabBarController or UINavigationController do not agree on a common orientation set.

Response: To make sure that all your child view controllers rotate correctly, you must implement shouldAutorotateToInterfaceOrientation for each view controller representing each tab or navigation level. Each must agree on the same orientation for that rotate to occur. That is, they all should return YES for the same orientation positions.

http://developer.apple.com/iphone/library/qa/qa2010/qa1688.html

Si può essere in grado di impostare l'orientamento del dispositivo all'interno del controller di navigazione anziché all'interno dei singoli punti di vista. Quindi è possibile controllare quale vista è in pila e ruotare in base al risultato. In questo modo, il controller di navigazione gestisce anche tutti gli orientamenti.

+0

non è questo il problema. per favore leggi attentamente la domanda C'è una vera differenza tra iPhone e iPad, come gestiscono questo problema ... – cocoapriest

+0

Ho capito il problema, stavo solo passando sotto la guida di Apple :) Se ritieni che sia un bug nel simulatore, dovresti archiviare un radar con Apple a proposito.Molte persone usano i controller di navigazione con l'orientamento, ma non riesco a trovare alcuna informazione su altri che hanno lo stesso problema, anche se 3.2 è uscito da molto tempo ormai. – iwasrobbed

+2

Penso che questo si applichi al tuo caso. La tua vista C supporta tutti gli orientamenti mentre A e B supportano solo il ritratto. Il QA1688 di Apple afferma che tutti i controller di visualizzazione figlio sotto un UINavigationController devono concordare un gruppo di commenti di orientamenti. Ho avuto lo stesso problema (vc non era d'accordo sugli orientamenti) in [questa domanda] (http://stackoverflow.com/questions/3086684). – progrmr

0

Ecco il codice che sto usando per evitare che questo errore:

- (void)viewDidLoad { 
    if (self.interfaceOrientation == UIInterfaceOrientationPortrait) { 
     self.view.transform = CGAffineTransformIdentity; 
     self.view.transform = CGAffineTransformMakeRotation(M_PI/2); 
     self.view.bounds = CGRectMake(0.0, 0.0, 480, 320); 
    } 
    [UIView commitAnimations]; 
} 

e

- (void)viewDidLoad { 
    if (self.interfaceOrientation == UIInterfaceOrientationLandscapeRight) { 
     self.view.transform = CGAffineTransformIdentity; 
     self.view.transform = CGAffineTransformMakeRotation(-(M_PI/2)); 
     self.view.bounds = CGRectMake(0, 0, 320, 480);; 
    } 
    [UIView commitAnimations]; 
} 

In base a quanto l'orientamento del dispositivo è in, è necessario modificare parte del codice .

+0

Perché impostare la trasformazione due volte? – progrmr

+0

Il primo imposta il tipo di trasformazione (identità) e il secondo esegue la trasformazione. Inoltre shouldAutoRotateToInterfaceOrientation dice di ruotare se il dispositivo è in tale orientamento. Se il dispositivo è in orizzontale, l'interfaccia non ruoterà a meno che non sia in verticale. Il codice che ho inviato è per l'iPhone (320 e 480), ma se l'orientamento del dispositivo è panoramico, la vista sarà simile a quella del ritratto, rendendo l'inclinazione dell'utente il dispositivo per impostarlo in verticale (viceversa). –

+0

Sono d'accordo con progrmr: non dovresti aver bisogno di assegnare la proprietà di trasformazione due volte. Il primo compito verrà semplicemente ignorato poiché non stai facendo nulla con esso. 'CGAffineTransformMakeRotation' non restituisce altro che una rotazione che indica una trasformazione dell'identità con una rotazione aggiuntiva. –

Problemi correlati