2013-04-18 10 views
5

Ho un'app scritta in una versione precedente di Xcode. In questo momento sto usando Xcode 4.6.1. Questa è un'app che ho ereditato da un altro sviluppatore sviluppato all'esterno dell'azienda.Orientamento predefinito dell'app

Uno dei problemi con questa app è la sua interfaccia. Dovrebbe essere impostato su LandscapeLeft (questo è il valore impostato nel file pList). L'app ignora questa direttiva e, invece, passa alla modalità verticale.

C'è qualcosa che devo fare per forzare il codice ad onorare questo valore? Sono relativamente nuovo per iOS/Objective-C. Il codice viene compilato ed eseguito, è solo l'interfaccia non sta facendo quello che voglio.

È leggermente più semplice poiché si tratta di un'app solo per iPad.

Edit Ho provato ad aggiungere il seguente codice a uno dei miei viewControllers problematici, ma non è stato onorato. Qualche idea su come forzare questa visione al paesaggio? (È ci una regolazione nell'IDE - sembra Xcode usato per avere un attributo di orientamento, ma non riesco a trovarlo in 4.6.1)

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation { 
    // Overriden to allow any orientation. 
    return ((interfaceOrientation==UIInterfaceOrientationMaskLandscapeLeft) || (interfaceOrientation == UIInterfaceOrientationMaskLandscapeRight)); 
} 

- (NSUInteger) supportedInterfaceOrientations 
{ 
    return UIInterfaceOrientationMaskLandscapeLeft; 
} 

- (NSInteger) supportedInterfaceOrientationsForWindow 
{ 
    return UIInterfaceOrientationMaskLandscape; 
} 

- (BOOL) shouldAutoRotate 
{ 
    return YES; 
} 
+0

Cosa succede se si rende '-shouldAutoRotate' return false? –

+0

@Richard - niente. Questa è stata una delle prime cose che ho provato quando non funzionava. – Tim

+0

Puoi essere più specifico su quali controller di visualizzazione ti stanno dando un problema? (ad esempio, sottoclasse, eventuali note interessanti, ecc.) –

risposta

5

Spero che questo ti possa aiutare. Aggiungere uno di questo (che orientamento desiderato) metodo nella AppDelegate.m classe

Per forza di applicazione completamente eseguito in modalità orizzontale:

- (NSUInteger)application:(UIApplication *)application supportedInterfaceOrientationsForWindow:(UIWindow *)window 
{ 
    return UIInterfaceOrientationMaskLandscape; 
} 

Per forza di applicazione completamente eseguito in modalità Ritratto:

- (NSUInteger)application:(UIApplication *)application supportedInterfaceOrientationsForWindow:(UIWindow *)window 
{ 
    return UIInterfaceOrientationMaskPortrait; 
} 
+0

Grazie, John! In realtà funziona anche con i nuovi iPad e quelli vecchi. (Devo supportare iPad 1s nell'ultima versione) – Tim

3

Verificare se vista controllori nella forza app orientamento della vista. Controllare la sezione 'Manipolazione Guarda Rotations' e le attività legate alla rotazione nella documentazione di Apple:

http://developer.apple.com/library/ios/documentation/UIKit/Reference/UIViewController_Class/Reference/Reference.html

+0

Ho dato un'occhiata alla documentazione e ho implementato i metodi raccomandati - ancora senza fortuna. Alcuni dei miei viewController sono predefiniti in Portrait e altri in modo predefinito in Landscape. Il formato corretto * dovrebbe * essere orizzontale. Questo è frustrante per non dire altro ... – Tim

0

Clicca sul file di progetto in Xcode. Quindi fare clic su "Obiettivi". Scegli il tuo orientamento (scorri verso il basso!) Assicurati che in IB la vista (Sotto ispettore) sia impostata su verticale.

+0

Ho provato anche quello. Purtroppo ci sono alcuni viewControllers che non rispettano le impostazioni della mia app. (È impostato su orizzontale, ma vanno in modalità verticale) – Tim

0

Avvio in modalità orizzontale

In iOS 5 è necessario implementare il metodo seguente in tutti i controller di vista.

// Called only in IO 5 and earlier. 
- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation 
{ 
    return (interfaceOrientation == UIInterfaceOrientationLandscapeRight || 
      interfaceOrientation == UIInterfaceOrientationLandscapeLeft); 
} 

e impostare UIInterfaceOrientation "orientamento interfaccia iniziale" per UIInterfaceOrientationLandscapeRight in Info.plist

E il layout delle viste in modalità orizzontale.

Per Apple's developer docs

0

Prima iOS 6 cioè in IOS 5 e precedenti, un'applicazione e la rotazione di un controller di vista è controllata dai singoli viewcontrollers mentre in iOS 6 e successive, il controller di vista responsabili rotazione sono del contenitore Viewcontrollers come UINavigationController & UITabBarController. Cosa stai usando come rootviewcontroller nel tuo progetto ??

autorotazione è chiaramente spiegato qui, in questo post

0

Prova questo, abbiamo avuto lo stesso problema.

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation 
{ 
    BOOL returningValue=NO; 

    if (interfaceOrientation==UIInterfaceOrientationIsPortrait(interfaceOrientation)) 
    { 
     returningValue=NO; 
    } 
    else if(UIInterfaceOrientationIsLandscape(interfaceOrientation)) 
    { 
     returningValue=YES; 
    } 

    return returningValue; 
} 
+0

Ti rendi conto che questo è un modo molto prolisso di scrivere 'return (UIInterfaceOrientationIsLandscape (interfaceOrientation)', giusto? – pille

+0

Sì! Ma questo è l'unico codice tra i molti che abbiamo provato e questo ha funzionato perfettamente per noi sia su iOS 5 sia su iOS 6. –

0

Nelle versioni Xcode precedenti, tutto quello che dovete fare è andare sul file .xib, selezionare la casella con le frecce che dice ritratto, e modificarlo Paesaggio, e poi nel file .m, fare:

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation { 
// Overriden to allow any orientation. 
return interfaceOrientation==UIInterfaceOrientationLandscapeLeft || interfaceOrientation == UIInterfaceOrientationLandscapeRight; 
} 
1

Sembra che avete tutto il codice di rotazione attuato correttamente nel vostro controller di vista, forse, questo è il vostro problema. Qualche tempo fa ero nelle tue scarpe, dove ho impostato il mio codice proprio come lo specificava la mela per caricare la mia app in modalità orizzontale, ma per qualche ragione semplicemente non stava caricando l'app correttamente. Quindi, dopo una serie di post sul forum e molte risposte al forum, nel mio controller di visualizzazione non ero in grado di impostare la visualizzazione dei controller di vista in loadView. Quindi assicurati che nel tuo metodo di visualizzazione del carico del controller di visualizzazione sia impostata la vista che desideri sia vista radice, come pure i controller di vista self.view. Dimmi come va

0

posto di controllo Launching application in landscape orientation for IPad
Citando jhhl da lì:

impostando l'orientamento interfaccia iniziale nella vostra info.plist viene ignorato se si dispone di orientamenti interfaccia supportati set con un altro orientamento nel primo slot! Metti il ​​tuo orientamento iniziale anche lì - e il simulatore lancerà correttamente, così come l'applicazione

Edit: una cosa - il problema potrebbe essere a posto completamente diverso. Sei sicuro di avere una corretta gerarchia dei controller di visualizzazione? Se a un controller non è stata aggiunta la strada giusta per la finestra o un altro controller, gli eventi di rotazione e la logica non funzioneranno. In effetti ho appena controllato un'app che ho scritto un paio di mesi fa e che aveva lo stesso problema - iPad, deve iniziare in orizzontale. Non ha preso nulla di particolare, ma impostando gli orientamenti in Info.plist, allegando il rootViewController e impostando i valori di ritorno appropriati nei metodi di rotazione.

0

Basta aprire la plist e modificare le "orientamenti interfaccia supportati" e trascinare il "Paesaggio (tasto home sinistro)" verso l'alto sopra la "(pulsante in basso a casa) Ritratto"

per impostazione predefinita il valore superiore viene caricato per primo se si supporta pre-iOS6 ed è in esecuzione nell'SDK post-iOS6.

0

Stai utilizzando iOS 6.0 o versioni successive? Quindi provare a implementare anche il metodo preferredInterfaceOrientationForPresentation.

- (UIInterfaceOrientation) preferredInterfaceOrientationForPresentation 
{ 
    return UIInterfaceOrientationLandscapeLeft; 
} 

Nel caso la vostra vista principale è un UINavigationController si potrebbe desiderare di sottoclasse che e implementare i nuovi metodi di orientamento in esso.

Quando voglio sostenere diverso orientamento di default in diversi UIViewController spinto allo stesso controller di navigazione ho un UINavigationControler personalizzato un po 'come questo:

@implementation MyNavigationController 

- (BOOL)shouldAutorotate; 
{ 
    return YES; 
} 

- (NSUInteger) supportedInterfaceOrientations 
{ 
    if ([[self topViewController] respondsToSelector:@selector(supportedInterfaceOrientations)]) 
     return [[self topViewController] supportedInterfaceOrientations]; 
    else 
     return [super supportedInterfaceOrientations]; 
} 

- (UIInterfaceOrientation) preferredInterfaceOrientationForPresentation 
{ 
    if ([[self topViewController] respondsToSelector:@selector(preferredInterfaceOrientationForPresentation)]) 
     return [[self topViewController] preferredInterfaceOrientationForPresentation]; 
    else 
     return [super preferredInterfaceOrientationForPresentation]; 
} 

@end 
0

La rootViewController -property è stata aggiunta alla UIWindow di classe in iOS 4. Normalmente questo valore è impostato su UIApplicationDelegate (nel tuo caso probabilmente AppDelegate.m). Se la proprietà rootViewController non è corretta, a volte gli eventi non vengono trasmessi correttamente attraverso la vista gerarchia.

Prova self.window.rootViewController = myRootViewController; se non è già lì.