2009-12-11 12 views
8

Sto sviluppando un'applicazione per iPhone con diversi pennini e dovrebbe essere solo orizzontale.Solo app per iPhone con più pennini

L'applicazione è impostata per l'avvio in modalità orizzontale tramite il file Info.plist.

Ho due controller di vista: FirstViewController e SecondViewController.

Per ognuno di questi ho un file pennino, in cui la vista è in orizzontale. Entrambi i controller di visualizzazione vengono aggiunti al mio pennino MainView come prese e le loro viste vengono inizializzate lentamente.

Quando l'applicazione viene caricata, la prima vista viene visualizzata in orizzontale, come previsto. Tuttavia, quando si passa alla seconda vista, il dispositivo (o il simulatore) rimane in orizzontale, ma la vista viene ruotata, come se il dispositivo fosse in modalità verticale, frenando la mia interfaccia.

In entrambe le classi UIViewController ho il seguente codice:

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation { 
    return interfaceOrientation == UIInterfaceOrientationLandscapeRight; 
} 

e per passare da una visualizzazione, nella mia app delegato che sto facendo:

[viewController.view removeFromSuperview]; 
[window addSubview:secondViewController.view]; 

dove viewController e secondViewController sono le due uscite dove sono collegati i controller della vista.

Questo è come la seconda vista appare in IB: alt text http://img27.imageshack.us/img27/4898/picture1ni.png

e questo è come appare nel simulatore: alt text http://img402.imageshack.us/img402/4866/picture2wt.png

Perché è che la seconda vista è la visualizzazione nel paesaggio, ma con l'interfaccia ruotato?

Non vorrei avere a che fare con le proprietà di trasformazione, poiché sembra eccessivo.

risposta

3

Ho recitato questa domanda sperando che qualcuno potesse darti una risposta perspicace e avrei imparato qualcosa .. purtroppo ho paura che potresti dover utilizzare le trasformazioni per far funzionare correttamente questo. Ecco il codice che ho usato di recente per risolvere il problema:

- (void)forceLandscapeForView:(UIView *)theView { 
    theView.transform = CGAffineTransformMakeRotation(degreesToRadian(90)); 
    theView.bounds = CGRectMake(0, 0, 480, 320); 
    theView.center = CGPointMake(160, 240); 
    [theView setNeedsLayout]; 
    [theView setNeedsDisplay]; 
} 

Poi, quando si aggiunge la nuova visualizzazione, controllare l'orientamento attuale e, se necessario, la forza della rotazione:

if (!UIDeviceOrientationIsLandscape([UIDevice currentDevice].orientation)) { 
    [self forceLandscapeForView:_activeViewController.view]; 
} 

Poi naturalmente si vorrà rispondere in modo appropriato a shouldAutorotateToInterfaceOrientation in ciascuno dei vostri vista controller:

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation { 
    return UIInterfaceOrientationIsLandscape(interfaceOrientation); 
} 

mi piacerebbe sentir parlare di soluzioni alternative, se questo non è tutto neces Sary.C'è anche un avvertimento che ho notato con questa impostazione: se si ha una transizione tra le visualizzazioni e si ruota il telefono durante quella transizione, è possibile che gli orientamenti delle visualizzazioni vengano capovolti o "bloccati" sull'orientamento orizzontale sbagliato, ad esempio che devi girare il telefono (orizzontale-destra vs paesaggio-sinistra) mentre navighi tra le visualizzazioni.

+0

Finora questo si è dimostrato l'approccio più affidabile per ottenere ciò che voglio. – pgb

+0

Questo (il primo metodo) ha funzionato per me. Sono stato alla ricerca di una soluzione per ore e ho provato qualcosa di simile in precedenza (ma all'interno delle visualizzazioni ha fatto il Load ...). Applicare la trasformazione sopra prima di aggiungerla come subView. – Wollan

0

è solo un suggerimento ma è possibile provare a restituire NO nel metodo shouldAotorotate per la seconda vista. Oppure prova a farlo nella visualizzazione verticale nell'IB. Sembra che la tua vista sia stata caricata correttamente (in modalità orizzontale), ma poi ha ricevuto il messaggio Autotorota ed è stata ruotata di 90 gradi.

+0

L'ho provato e non ho funzionato. – pgb