App per iPhone in modalità orizzontale, sistemi 2008


98

Si prega di notare che questa domanda è del 2008 e ora è di solo interesse storico.


Qual è il modo migliore per creare un'applicazione per iPhone che funzioni in modalità orizzontale dall'inizio, indipendentemente dalla posizione del dispositivo?

Sia a livello di codice che utilizzando Interface Builder.


5
Per tutti i futuri lettori, si prega di notare che questo famoso problema è ora RISOLTO da Apple a partire dal 2011. Notare il progetto di prova nella risposta sotto.
Fattie

Risposte:


47

Solo risposta storica. Spettacolarmente antiquato.

Tieni presente che questa risposta è ora estremamente obsoleta /

Questa risposta è solo una curiosità storica .


Notizie entusiasmanti! Come scoperto da Andrew di seguito, questo problema è stato risolto da Apple nella versione 4.0+.

Sembrerebbe che NON sia più necessario forzare la dimensione della vista su ogni vista, e il grave problema specifico del paesaggio "che funziona solo la prima volta" è stato risolto.

Ad aprile 2011, non è possibile testare o addirittura costruire nulla al di sotto di 4.0, quindi la domanda è puramente una curiosità storica. È incredibile quanti problemi ha causato agli sviluppatori per così tanto tempo!


Ecco la discussione e la soluzione originali. Questo è del tutto irrilevante ora, poiché questi sistemi non sono nemmeno utilizzabili.


È ESTREMAMENTE DIFFICILE far funzionare tutto questo - ci sono almeno tre problemi / bug in gioco.

prova questo .. interfaccia builder landscape design

Nota in particolare che dove dice "e devi usare shouldAutorotateToInterfaceOrientation correttamente ovunque" significa ovunque, tutte le tue visualizzazioni a schermo intero.

Spero che aiuti in questo incubo!

Un importante promemoria del noto problema AGGIUNTIVO qui a portata di mano: se stai cercando di passare da PIÙ DI UNA vista (tutta orizzontale), SEMPLICEMENTE NON FUNZIONA . È essenziale ricordarlo o sprecherai giorni sul problema. È letteralmente NON POSSIBILE. È il più grande bug aperto e conosciuto sulla piattaforma iOS. Non c'è letteralmente alcun modo per fare in modo che l'hardware faccia la seconda vista caricata, sia orizzontale. La soluzione alternativa fastidiosa ma semplice, e ciò che devi fare, è avere un banale UIViewController master che non fa altro che sederti lì e lasciarti scambiare le tue opinioni.

In altre parole, in iOS a causa di un importante bug noto:

[window addSubview:happyThing.view];
[window makeKeyAndVisible];

Puoi farlo solo una volta . Successivamente, se provi a rimuovere happyThing.view e invece inserisci newThing.view, NON FUNZIONA - E QUELLO. La macchina non ruoterà mai la vista in orizzontale. Non ci sono trucchi, nemmeno Apple non può farlo funzionare. La soluzione alternativa che devi adottare è avere un UIViewController generale che si trova semplicemente lì e contiene solo le tue varie visualizzazioni (happyThing, newThing, ecc.). Spero che sia d'aiuto!


2
Credo che questo sia stato risolto in 4.x. Abbiamo distribuito un gioco che aveva diversi schermi, alcuni in orizzontale e in verticale, e semplicemente non funzionava nella 3.x. Non volendo entrare nella vista fittizia extra per gestirlo, abbiamo invece richiesto 4.x - che, un anno dopo questa domanda, è probabilmente OK.
AndrewS

Non abbiamo fatto "sempre paesaggio" ma piuttosto variamente paesaggio o ritratto. Ogni VC viene aggiunto e rimosso direttamente dalla finestra. L'app si avvia in orizzontale, rimane tale per diverse transizioni dello schermo. Non usiamo una vista fittizia, ma eseguiamo l'override di shouldAutorotate in ogni schermata. Nessun problema su 4.x, dal tocco al pad al telefono.
AndrewS

41

Dal sito di sviluppo di Apple:

Per avviare l'applicazione in modalità orizzontale in modo che la barra di stato si trovi immediatamente nella posizione appropriata, modifica il tuo file Info.plist per aggiungere la chiave UIInterfaceOrientation con il valore appropriato (UIInterfaceOrientationLandscapeRight o UIInterfaceOrientationLandscapeLeft), come mostrato nel Listato 2.

Listato 2: avvio dell'applicazione in modalità orizzontale

<key>UIInterfaceOrientation</key>
<string>UIInterfaceOrientationLandscapeRight</string>

5
Questo plus nei tuoi metodi shouldAutorotateToInterfaceOrientation return (interfaceOrientation! = UIInterfaceOrientationPortrait); e hai finito.
Michael Behan

5
La domanda chiede come avviare il dispositivo in modalità orizzontale. Le risposte danno quell'informazione. La gestione dell'orientamento successivo non è menzionata nella domanda. +1 Michael Pryor
ingh.am

1
Curiosamente, la "risposta" infatti NON avvierà il dispositivo in modalità orizzontale - !! È probabilmente il singolo bug / difficoltà più famoso in tutto l'ambiente Apple. È una base per sviluppatori di iPad molto attivi!
Fattie

@mbehan C'è anche UIInterfaceOrientationPortraitUpsideDown, quindi non è una correzione. Inoltre, UIInterfaceOrientation in .plist è supportato solo su 3.2+, non su dispositivi 3.1.3 e precedenti (e ricorda che iPhone 2G è bloccato su quella versione).
Ivan Vučica

28

Riepilogo e integrazione da tutti i post, dopo averlo testato personalmente; controllare l'aggiornamento per 4.x, 5.x di seguito.

A partire dalla versione 3.2 non è possibile modificare l'orientamento di un'applicazione in esecuzione dal codice.

È tuttavia possibile avviare un'applicazione con un orientamento fisso, sebbene ciò non sia semplice.

Prova con questa ricetta:

  1. imposta il tuo orientamento UISupportedInterfaceOrientationsnel Info.plistfile
  2. nella finestra definire un "controller di visualizzazione di base" 480x320. Ogni altra visualizzazione verrà aggiunta come sottoview alla relativa visualizzazione.
  3. in tutte le visualizzazioni i controller impostano il shouldAutorotateToInterfaceOrientation:metodo (per restituire lo stesso valore che hai definito nel plist, ovviamente)
  4. in tutte le visualizzazioni i controller impostano una visualizzazione in background con

    self.view.frame = CGRectMake(0, 0, 480, 320)

    nel viewDidLoadmetodo.

Aggiornamento (iOS 4.x, 5.x) : la Guida alla programmazione dell'app Apple iOS ha un paragrafo "Avvio in modalità orizzontale" nel capitolo "Trucchi avanzati dell'app".

Riferimenti:


1
Posso confermare che questa è l'unica soluzione veramente funzionante (con una piccola aggiunta). Mi ci sono volute ore per trovarlo e valutarlo. Tutte le altre risposte sono solo soluzioni parziali al problema.
Johannes Rudolph

8

Per prima cosa ho impostato info.plist

<key>UIInterfaceOrientation</key>
<string>UIInterfaceOrientationLandscapeRight</string>

poi metto questo codice in applicationDidFinishLaunching:

CGAffineTransform rotate = CGAffineTransformMakeRotation(1.57079633);
[window setTransform:rotate];

CGRect contentRect = CGRectMake(0, 0, 480, 320); 
window.bounds = contentRect; 
[window setCenter:CGPointMake(160.0f, 240.0f)]; 

In questo modo posso lavorare sulla vista in Interface Builder in modalità orizzontale.


7

La risposta di sasb e michaelpryor sembra essere corretta, ma se non funziona per te, prova questa alternativa:

- (void)applicationDidFinishLaunchingUIApplication *)application {
    application.statusBarOrientation = UIInterfaceOrientationLandscapeRight;
}

O questo:

[[UIDevice currentDevice] setOrientation:UIInterfaceOrientationLandscapeRight];

O questo:

[application setStatusBarOrientation: UIInterfaceOrientationLandscapeRight animated:NO];

Potrebbe anche essere necessario chiamare window makeKeyAndVisible;prima.

Alcuni link: sviluppo in modalità orizzontale , iPhone SDK: come forzare solo la modalità orizzontale ?

@Robert: fare riferimento a iPhone SDK, NDA e Stack Overflow .


6

Sono sorpreso che nessuno abbia ancora trovato questa risposta:

In tutti i miei test, quando si elimina un controller di visualizzazione modale, l'orientamento preferito del controller di visualizzazione padre impostato in shouldAutorotateToInterfaceOrientationviene rispettato anche quando fa parte di un UINavigationController. Quindi la soluzione a questo è semplice:

Crea un UIViewController fittizio con un UIImageView per uno sfondo. Imposta l'immagine sull'immagine default.png che la tua app usa all'avvio.

Quando viewWillAppearviene chiamato nel controller della vista principale, è sufficiente presentare il controller della vista fittizio senza animazione.

quando viewDidAppearviene chiamato nel tuo controller di visualizzazione fittizio, chiudi il controller di visualizzazione con una bella animazione a dissolvenza incrociata.

Non solo funziona, ma ha un bell'aspetto! BTW, solo per chiarimenti faccio il controller di visualizzazione di root in viewWillAppearquesto modo:

- (void)viewWillAppear:(BOOL)animated
{
 if ( dummy != nil ) {
  [dummy setModalTransitionStyle:UIModalTransitionStyleCrossDissolve];
  [self presentModalViewController:dummy animated:NO];
  [dummy release];
  dummy = nil;
 }
...
}

5

L'ultima guida alla programmazione di iPhone OS ha una sezione completa su questo, con codice di esempio. Sono sicuro che questa sia un'aggiunta recente, quindi forse te la sei persa. Spiega tutte le condizioni che devi rispettare; fondamentalmente...

  • impostare le proprietà Info.plist (questo cambia la posizione della barra di stato, ma non la vista)
  • ruotare la vista manualmente attorno al suo centro, sul metodo UIViewController viewDidLoad: o sul metodo applicationDidFinishLaunching: o implementare la rotazione automatica ("Comportamenti di ridimensionamento automatico", pagina 126)

Cerca "Avvio in modalità orizzontale", pagina 102.


4

Vedi questa risposta: Modalità orizzontale SOLO per iPhone o iPad

  1. aggiungi orientamento a plist
  2. shouldAutorotateToInterfaceOrientation = YES in tutti i file

Anche se stai usando modalità miste, potresti stare meglio con

[[UIDevice currentDevice] setOrientation:UIInterfaceOrientationLandscapeRight];
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.