2012-04-10 7 views
1

Ich entwickle eine XIB-basierte Nur-Landschafts-App. Die App wird korrekt im Querformat gestartet. Die Ansicht in meinem Haupt-ViewController wird jedoch im Hochformat angezeigt. Das heißt, es ist um 90 Grad gedreht, so dass das Bild beschnitten erscheint und nicht den gesamten Bildschirm einnimmt. Wenn ich mit meiner Schnittstelle einen Modal-View-Controller präsentiere und dann zum Haupt-ViewController zurückkehre, korrigiert sich das Problem selbst (die Ansicht wird im Querformat dargestellt). Dieses Problem trat unter Xcode 4.2 nicht auf. Es trat nach dem Upgrade auf Xcode 4.3 auf, und die einzigen Codeänderungen, die vorgenommen wurden, wurden automatisch von Xcode implementiert, wenn ich die Projekteinstellungen aktualisierte.UIWindows root-View-Controller wird beim App-Start nicht in Querformat gedreht.

Basierend auf den Empfehlungen in anderen Beiträgen habe ich meine Info.plist-Einstellungen für unterstützte Schnittstellenausrichtungen und anfängliche Schnittstellenausrichtung verifiziert. Ich überschrieb die Methode shouldAutorotateToInterfaceOrientation für jeden meiner View-Controller, um YES nur für Querformatausrichtungen zurückzugeben. Außerdem habe ich die automatische Größenanpassung für die Ansicht deaktiviert, da ich nie möchte, dass sich die Größe/Ausrichtung der Ansicht ändert.

Basierend auf den Ideen in diesem Link [1], vermutete ich das Problem ist, dass die Ansicht nicht den Aufruf zum Ändern der Ausrichtung beim Start möglicherweise aufgrund der Beseitigung der MainWindow.xib-Konzept, das zu sein scheint durch den folgenden Xcode-eingegebene Code in AppDelegate.m ersetzt:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions 
{ 
    self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]]; 
    self.viewController = [[ViewController alloc] initWithNibName:@"ViewController" bundle:nil]; 
    self.window.rootViewController = self.viewController; 
    [self.window makeKeyAndVisible]; 

    return YES; 
} 

I diese Methode wird ein generischen root-view-Controller aus dem meine Viewcontroller Klasse dargestellt zu erzeugen modifizierte, wie in dem folgenden Code gezeigt:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions 
{ 
    self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]]; 
    ViewController* myViewController = [[ViewController alloc] initWithNibName:@"ViewController" bundle:nil]; 
    self.viewController = [[UIViewController alloc] init]; 
    self.window.rootViewController = self.viewController; 
    [self.window makeKeyAndVisible]; 
    [self.viewController presentModalViewController:myViewController animated:NO]; 
    return YES; 
} 

Voila! Das hat mein Problem gelöst. Für mich fühlt sich das jedoch wie eine Veränderung auf fundamentaler Ebene an, die ich an dieser Stelle in meiner Entwicklung nicht machen möchte. Was ich mein Root View Controller sein wollte, ist jetzt eine modale Ansicht. Hat jemand eine andere Lösung für dieses Problem?

Vielen Dank im Voraus!

Antwort

4

Ich hatte das gleiche Problem: eine App, die in Landscape sein sollte, die davon ausging, dass der ViewController immer in Portrait war. Ich habe jede Menge Änderungen an jedem Aspekt des Projekts und an info.plist vorgenommen, einschließlich der Übergabe eines Root-View-Controllers an das Haupt-UIWindow. Es hat immer noch nicht funktioniert. Ich habe schließlich alle Änderungen rückgängig gemacht und fügte nur die beiden unten aufgeführten Zeilen zu meinem App-Delegierten hinzu:

Nichts anderes war notwendig.

Es scheint, dass in iOS 6 die UIWindow root-view-controller Einstellung in Interface Builder manchmal ignoriert wird. Ich bin mir sicher, dass meine Argumentation irgendwo falsch ist, aber ich dachte, dass dies dazu beitragen könnte, jemanden in die Richtung einer umfassenderen, umfassenderen Antwort zu bringen.

0

In iOS 8 ist auch ein Einstellungsfenster für den UIScreen erforderlich, da dieser nicht automatisch aktualisiert wird.

self.window.frame = [UIScreen mainScreen].bounds;