5

Ich brauche meine App sowohl auf dem iPad als auch auf dem iPhone kompatibel. Es hat einen TabbarController als rootViewController.Unterstützung der Universal-App mit Portrait-Ausrichtung auf iPhone und Querformat + Portrait auf dem iPad

In iPad muss ich es sowohl auf Landscape und Portrait verfügbar sein. In iPhone obwohl ich die rootView, um selbst Portrait zu sein, und ich habe einige ViewsControllers, die auf dem TabbarController präsentiert werden, die sowohl im Querformat und Hochformat verfügbar sein müssen (z. B. ein ViewController zum Abspielen von Videos von Youtube). Also sperre ich die Drehung des TabbarControllers wie folgt (in der UITabbarController Subclass).

# pragma mark - UIRotation Methods 

- (BOOL)shouldAutorotate{ 
    return (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad); 
} 

- (NSUInteger)supportedInterfaceOrientations{ 
    return (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad) ? UIInterfaceOrientationMaskAll : UIInterfaceOrientationMaskPortrait; 
} 

Was ich beabsichtige zu tun ist, dass durch die Drehung des RootViewController (TabBarController) blockiert, ich bin Verriegelung der alle VCs in der TabBarController (nur auf dem iPhone) und Ansichten, die auf der Oberseite des TabBarController präsentiert werden können Drehen Sie sich entsprechend der Ausrichtung des Geräts.

DAS PROBLEM

Alles funktioniert wie erwartet, bis die App in der Landschaft in dem iPhone gestartet wird. Wenn sie im Querformat-Modus gestartet wird, wird die App standardmäßig im Querformat angezeigt und die App wird im Querformatmodus gestartet, was nicht beabsichtigt ist. Es sollte im Portrait-Modus selbst starten, auch wenn die Geräteausrichtung Landscape ist. Da ich die automatische Rotation für das iPhone deaktiviere, befindet sich die App weiterhin im Querformat, was zu einem Fehler führt. Ich habe versucht, diese Methode, um die App zu zwingen, im Portrait zu starten in der Anwendung: didFinishLaunchingWithOptions:

#pragma mark - Rotation Lock (iPhone) 

- (void)configurePortraitOnlyIfDeviceIsiPhone{ 
    if ((UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPhone)) 
     [[UIApplication sharedApplication] setStatusBarOrientation:UIInterfaceOrientationPortrait]; 
} 

das Problem weiterhin besteht. Ich habe alle Orientierungsoptionen auf der info.plist für SupportedInterfaceOrientaions Taste sowohl für iPad und iPhone erlaubt, da ich die App in der Landschaft für das iPhone sein muss, auch wenn nur für ein paar ViewControllers. Das Problem kann behoben werden, wenn ich die App dazu zwingen kann, im Hochformat zu starten, auch wenn die Geräteausrichtung Landscape lautet. Bitte korrigieren Sie mich, wenn Sie in der Logik falsch liegen, wenn nicht, wird jede Hilfe hilfreich sein, die App im Hochformat starten zu lassen.

Ich habe bereits this question here und here durchlaufen, aber konnte es noch nicht funktionieren.

Vielen Dank

Antwort

4

So habe ich es geschafft zu arbeiten. In AppDelegate.m habe ich diese Methode hinzugefügt.

Diese Methode prüft jedes Mal, wenn eine Ansicht für die Ausrichtung angezeigt wird, und korrigiert die Ausrichtung wie erforderlich. Ich gebe alle Ausrichtung für das iPad und keine für das iPhone zurück mit der Ausnahme, dass die Ansicht, die dargestellt werden soll (die, die gedreht werden sollte, YouTubeVideoPlayerViewController), ausgelassen wird.

Und in der TabBarController Unterklasse war

# pragma mark - UIRotation Methods 

- (BOOL)shouldAutorotate{ 
    return YES; 
} 

- (NSUInteger)supportedInterfaceOrientations{ 
    return (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad) ? UIInterfaceOrientationMaskAll : UIInterfaceOrientationMaskPortrait; 
} 

Das Problem, dass, wenn wir keine Rückkehr der App shouldAutoRotate ignoriert alle Drehänderungsbenachrichtigungen. Es sollte YES zurückgeben, so dass es sich in die korrekte Orientierung dreht, wie in support.interfaceOrientations beschrieben. Ich nehme an, dass wir uns so an diese Anforderung annähern sollten, anstatt die Rotationsanweisungen an die jeweiligen viewControllers weiterzuleiten, so wie es viele Posts über SO gesagt haben.Dies ist ein Vorteil der Verwendung von Containern, wie von Apple empfohlen, so dass wir keine Rotationsanweisungen für jede Ansicht in einem Container schreiben müssen.

+0

Gutes Verständnis, ich werde dies implementieren. Danke, ich habe diese Art von Lösung gesucht, die wir in AppDelegate implementieren können, und müssen nicht in alle View-Controller schreiben. –

Verwandte Themen