2012-10-17 3 views
6

Ich habe benutzerdefinierte Split-View-Controller in meiner App mit einem Master-Controller und einem detaillierten Controller.Unterstützung verschiedener Ausrichtungen in iOS 6.0 für verschiedene View-Controller

- (id)initWithMasterController:(UIViewController*)aMasterController 
      detailedController:(UIViewController*)aDetailedController; 

Die für den Master-Controller und den Details-Controller bereitgestellten Controller sind UINavigationController.

Im Rahmen meiner App, gibt es zwei mögliche Fälle zur Orientierung Handhabung:

  1. Wenn sechs Kombination von Controllern in Master und Details Controller verwendet werden, werden alle Orientierungen für die App unterstützt werden.
  2. Wenn ein StudentDetailsViewController allein am Detail-Controller vorhanden ist, können nur zwei mögliche Ausrichtungen unterstützt werden. (Landschaft)

Wann immer die Ausrichtung des Geräts geändert wird, passieren die folgenden Dinge in Versionen unter iOS 6,0

  1. Die -shouldAutorotateToInterfaceOrientation: Methode aufgerufen wird. Die Implementierung dieser Methode ist unten: Zur Laufzeit leite ich die Anfrage an den Master-Controller und den Detail-Controller mit dem gleichen Aufruf weiter.

    - (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation 
    { 
        BOOL res = [masterController shouldAutorotateToInterfaceOrientation:interfaceOrientation] 
           && [detailedController shouldAutorotateToInterfaceOrientation:interfaceOrientation]; 
        return res; 
    } 
    
  2. Die -shouldAutorotateToInterfaceOrientation des masterController wird TRUE zurück. Die Implementierung der Methode in StudentViewController ist unten.

    - (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation 
    { 
        return (IS_IPAD) ? UIInterfaceOrientationIsLandscape(interfaceOrientation) 
            : UIInterfaceOrientationIsPortrait(interfaceOrientation); 
    } 
    

Die Fähigkeit, Informationen über die neue Ausrichtung zu erhalten geändert werden soll, hilft mir zu entscheiden, ob eine Drehung oder nicht aktiviert werden.

Mit iOS 6.0:

Wann immer die Ausrichtung des Geräts geändert wird, werden die folgenden Dinge passieren in Versionen von iOS 6,0

  1. Verfahren -shouldAutorotate des geteilten View-Controller wird aufgerufen. Seine Umsetzung ist unter

    - (BOOL)shouldAutorotate { 
        BOOL res = [masterController shouldAutorotate] 
           && [detailedController shouldAutorotate]; 
        return res; 
    } 
    
  2. Die detailedController der shouldAutorotate die Navigation nennt. Die Implementierung von autorotate Funktion in StudentsController:

    - (BOOL)shouldAutorotate { 
        return YES; 
    } 
    
    - (NSUInteger)supportedInterfaceOrientations { 
        return (UIInterfaceOrientationMaskLandscapeLeft 
          | UIInterfaceOrientationMaskLandscapeRight); 
    } 
    

Aber mit iOS 6.0, ich bin nicht in der Lage, die Orientierung zu steuern. Auch wenn die Methode supportedInterfaceOrientations aufgerufen wird, wenn die Methode sentAutorotate des StudentsDetailsController von der Methode shouldAutorotate von detailsController aufgerufen wird, folgt shouldAutorotateMethod nicht den in der Methode supportedInterfaceOrientations erwähnten Optionen.

UPDATE:

las ich die Dokumentation und die unten Noten werden in der document zur Verfügung gestellt.

manchmal möchten Sie vielleicht die automatische Rotation dynamisch deaktivieren. Für Beispiel könnten Sie dies tun, wenn Sie die Rotation für eine kurze Zeit vollständig unterdrücken möchten. Sie müssen die Ausrichtungsänderungen vorübergehend deaktivieren, wenn Sie die Position der Statusleiste manuell steuern möchten (z. B. beim Aufruf der Methode setStatusBarOrientation: animated: ).

Wenn Sie die automatische Drehung vorübergehend deaktivieren möchten, vermeiden Sie , um die Ausrichtungsmasken zu manipulieren. Überschreiben Sie stattdessen die Methode shouldAutorotate auf dem obersten View-Controller. Diese Methode wird vor dem Ausführen einer Autorotation aufgerufen. Wenn NEIN zurückgegeben wird, wird die Rotation unterdrückt.

Kann die automatische Drehung basierend auf der aktuellen Ausrichtung vorübergehend deaktiviert werden?

+0

Die Code-Formatierung nicht korrekt durchgeführt werden konnte .. – Krishnan

+0

Sie das Problem gelöst haben? Ich habe das gleiche Problem und kann nicht herausfinden, wie man das sowohl für ios5 als auch 6 – Stas

+0

behandelt. Nein, ich habe es nicht gelöst .. – Krishnan

Antwort

0

Ich glaube, das ist eine Art von Problem in iOS, wo der RootViewController die ChildViewController für ihre bevorzugte Orientierung nicht konsultieren. Sie sollten jedoch Folgendes versuchen:

if (self.interfaceOrientation != UIInterfaceOrientationPortrait) 
{ 
    [[UIDevice currentDevice] performSelector:NSSelectorFromString(@"setOrientation:") withObject:(id)UIInterfaceOrientationPortrait]; 
} 

, um die Ausrichtung für eine bestimmte Ansicht zurück in das Hochformat zu ändern.

0

In Ihrer Anwendung Delegate-Klasse definieren Sie die folgende Methode, diese Methode wird vor allen anderen Rotationsmethoden in der Anwendung aufgerufen.

Erstellen Sie ein Flag (isRotationEnabled), das die Ausrichtung Ihrer App entscheidet.

- (NSUInteger) application:(UIApplication *)application supportedInterfaceOrientationsForWindow:(UIWindow *)window {  

return self.isRotationEnabled ? 
    UIInterfaceOrientationMaskAll : 
    UIInterfaceOrientationMaskPortrait; 
} 

Ändern dieses Flag auf der Basis verschiedener Bedingungen in Ihnen App mit dem folgenden Code

MyAppDelegate *appDelegate = (MyAppDelegate *)[[UIApplication sharedApplication] delegate]; 
appDelegate.isRotationEnabled = NO;