Domanda

Nota:questa domanda è del 2008 e ora è solo di interesse storico.


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

Sia a livello di programmazione che utilizzando Interface Builder.

È stato utile?

Soluzione

Solo risposta storica.Spettacolarmente obsoleto:

Tieni presente che questa risposta è ormai estremamente obsoleta.

Questo post è solo una curiosità storica.


Novità 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 veduta su ogni veduta, e che il grave problema specifico del paesaggio “funziona solo la prima volta” sia stato risolto.

Dall'aprile 2011 non è possibile testare o costruire nulla al di sotto della versione 4.0, quindi la questione è puramente una curiosità storica.È incredibile quanti problemi abbia causato agli sviluppatori per così tanto tempo!


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


È ESTREMAMENTE DIFFICILE farlo funzionare completamente: ci sono almeno tre problemi/bug in gioco.

prova questo .. progettazione del paesaggio del costruttore di interfacce

Si noti in particolare quello dove dice "e devi utilizzare ShouldAutorotateToInterfaceOrientation correttamente ovunque" significa ovunque, tutte le tue visualizzazioni a schermo intero.

Spero che ti aiuti in questo incubo!

Un importante promemoria dell'ULTERIORE noto problema in questione qui:se stai cercando di scambiare tra PIÙ DI UNA vista (tutto orizzontale), SEMPLICEMENTE NON FUNZIONA.È essenziale ricordarlo o perderai giorni con il problema.NON È letteralmente POSSIBILE.È il più grande bug aperto e conosciuto sulla piattaforma iOS.Non c'è letteralmente alcun modo per fare in modo che l'hardware renda la seconda vista che carichi, sia orizzontale.La soluzione fastidiosa ma semplice, e ciò che devi fare, è avere un banale UIViewController principale che non fa altro che sedersi lì e consentirti di passare da una visualizzazione all'altra.

In altre parole, in iOS a causa di un grave 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 - ED È QUELLO.La macchina non ruoterà mai la visuale in orizzontale.Non esistono trucchi, nemmeno Apple riesce a farlo funzionare.La soluzione alternativa che devi adottare è avere un UIViewController generale che semplicemente si trova lì e contiene solo le tue varie visualizzazioni (happyThing, newThing, ecc.).Spero che sia d'aiuto!

Altri suggerimenti

Dal sito degli sviluppatori Apple:

Per avviare l'applicazione in modalità paesaggio in modo che la barra di stato si trovi immediatamente nella posizione appropriata, modifica il file Info.PList per aggiungere il tasto UiInterfaceorientation con il valore appropriato (UiInterfaceorientationLandScaperight o UiInterfaceorientationlandScapeft), come mostrato nell'elenco 2.

Elenco 2:Avvio dell'applicazione in modalità paesaggio

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

Riepilogo e integrazione di tutti i post, dopo averlo testato personalmente;controlla 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.

Ma è possibile avviare un'applicazione con un orientamento fisso, anche se ciò non è semplice.

Prova con questa ricetta:

  1. imposta il tuo orientamento su UISupportedInterfaceOrientations nel Info.plist file
  2. nella tua finestra definisci un "controller di visualizzazione base" 480x320.Ogni altra vista verrà aggiunta come sottovista alla sua vista.
  3. in tutti i controller di visualizzazione impostare il file shouldAutorotateToInterfaceOrientation: metodo (per restituire lo stesso valore definito nel plist, ovviamente)
  4. in tutti i controller di visualizzazione imposta una vista di sfondo con

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

    nel viewDidLoad metodo.

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

Riferimenti:

Per prima cosa ho impostato info.plist

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

quindi inserisco 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.

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

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

Oppure questo:

[[UIDevice currentDevice] setOrientation:UIInterfaceOrientationLandscapeRight];

Oppure questo:

[application setStatusBarOrientation: UIInterfaceOrientationLandscapeRight animated:NO];

Potrebbe anche essere necessario chiamare window makeKeyAndVisible; Primo.

Alcuni link: Sviluppo in modalità orizzontale, SDK dell'iPhone:Come forzare solo la modalità orizzontale?

@Roberto:per favore riferisci a L'iPhone SDK, NDA e Stack Overflow.

Mi sorprende che nessuno abbia ancora trovato questa risposta:

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

Crea un UIViewController fittizio con un UIImageView come sfondo.Imposta l'immagine sull'immagine default.png utilizzata dall'app all'avvio.

Quando viewWillAppear viene chiamato nel controller della vista root, basta presentare il controller della vista fittizio senza animazione.

Quando viewDidAppear viene chiamato nel tuo controller di visualizzazione fittizio, chiudi il controller di visualizzazione con una bella animazione di dissolvenza incrociata.

Non solo funziona, ma sembra anche bello!A proposito, solo per chiarimenti eseguo il controller della vista root viewWillAppear come questo:

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

L'ultima guida alla programmazione del sistema operativo iPhone contiene una sezione completa su questo argomento, 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...

  • imposta le proprietà Info.plist (questo cambia la posizione della barra di stato, ma non la vista)
  • ruota manualmente la vista attorno al suo centro, sul tuo UIViewController viewDidLoad:metodo o l'applicazioneDidFinishLaunching:metodo o implementare la rotazione automatica ("Comportamenti di ridimensionamento automatico", pagina 124)

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

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

  1. aggiungi l'orientamento a plist
  2. dovrebbeAutorotateToInterfaceOrientation = SÌ in tutti i file

Tuttavia, se utilizzi modalità miste, potrebbe essere meglio

[[UIDevice currentDevice] setOrientation:UIInterfaceOrientationLandscapeRight];
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top