2013-05-02 9 views
15

Also entwickle ich eine iPad-App, die nur den Landschaftsmodus unterstützt, außer auf einem Modalansicht-Controller. Das Problem, das ich habe, ist, dass, sobald ich die modale Ansicht präsentiere und die Ausrichtung auf Hochformat ändere, die Ansicht verwerfen, die Elternansicht (die nur Landschaft unterstützen soll) im Hochformat ist, bis ich das Gerät rotiere, in das es dann zurückgeht Landschaft und bleibt so. Ich habe mich selbst verprügelt, um herauszufinden, wie ich die ursprüngliche Orientierung der Eltern behalten kann, aber ich konnte keine Lösung finden.Die Orientierung der Elternansicht beibehalten, nachdem die Modalansicht mit anderer Ausrichtung dargestellt wurde

Ich habe den folgenden Code in meiner AppDelegate Orientierung zu ermöglichen, ändert sich nur, dass die einzelnen modal-Ansicht (GalleryPhotoViewer):

- (NSUInteger)application:(UIApplication *)application supportedInterfaceOrientationsForWindow:(UIWindow *)window{ 
NSUInteger orientations = UIInterfaceOrientationMaskAllButUpsideDown; 

    if(self.window.rootViewController){ 
     UIViewController *presentedViewController = [[(UINavigationController *)self.window.rootViewController viewControllers] lastObject]; 

     //Support Portrait mode only on Photoviewer 
     if ([[presentedViewController presentedViewController] isKindOfClass:GalleryPhotoViewController.class]) { 
      orientations = UIInterfaceOrientationMaskAll; 
     }else{ 
      orientations = [presentedViewController supportedInterfaceOrientations]; 

     } 
    } 

    return orientations; 
} 

Von der übergeordneten Klasse (PhotosViewController) Ich rufe:

GalleryPhotoViewController *gpView = [GalleryPhotoViewController new]; 
[self presentViewController:gpView animated:YES completion:nil]; 

auch in meinen Eltern (und anderen Ansichten) ich den folgenden Code habe Portrait-Modus nicht zulassen:

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

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation 
{ 
    if(interfaceOrientation == UIInterfaceOrientationPortrait) { 
     return YES; 
    } else { 
     return NO; 
    } 
} 

Irgendwelche Ideen, wie ich die Orientierung in meiner Elternansicht beibehalten kann? Ich dachte darüber nach, die Ausrichtung des Parent in der viewWillAppear-Methode möglicherweise nur programmatisch zu ändern, sobald das Modal nicht mehr existiert, aber ich wusste nicht, was die vorherige Ausrichtung war, ganz zu schweigen davon, dass ich keinen Code dafür gefunden hatte unabhängig von ios6.

BEARBEITEN/LÖSUNG: Also habe ich eine Lösung gefunden und was ich am Ende getan habe, war die Anwendung: supportedInterfaceOrientationsForWindow: code und einfach die UINavigation Subclass zur übergeordneten Ansicht hinzuzufügen, die die modale Ansicht präsentierte und alles wie erwartet funktionierte Der Elternteil behielt seine ursprüngliche Orientierung bei, während sich das Modal frei ändern konnte.

In meinen Eltern:

//To make sure that this view remains in Landscape 
@implementation UINavigationController (Rotation_IOS6) 

-(BOOL)shouldAutorotate 
{ 
    return [[self.viewControllers lastObject] shouldAutorotate]; 
} 

-(NSUInteger)supportedInterfaceOrientations 
{ 
    return [[self.viewControllers lastObject] supportedInterfaceOrientations]; 
} 

@end 

Dank @ Matt für die Anregungen.

Antwort

11

Ich denke, das Problem ist Ihre Verwendung von application:supportedInterfaceOrientationsForWindow:. Heben Sie stattdessen das Problem auf und beginnen Sie mit einer UINavigationController-Unterklasse und machen Sie diese zur Klasse des Root-View-Controllers, der Ihre Navigationsschnittstelle darstellt. Dann:

  • In der UINavigationController Unterklasse zurückkehren UIInterfaceOrientationMaskLandscape von supportedInterfaceOrientations.

  • Im dargestellten (modalen) View-Controller geben Sie UIInterfaceOrientationMaskAll von supportedInterfaceOrientations zurück.

+0

So fand ich eine Lösung, und was ich am Ende tun verlassen die Anwendung: supportedInterfaceOrientationsForWindow: Code und einfach Hinzufügen der UINavigation Unterklasse der übergeordneten Ansicht, die die modale Ansicht und alles funktionierte präsentiert wurde. Danke für die Hilfe. – shokaveli

+0

Wenn ich Ihnen geholfen habe, können Sie meine Antwort vielleicht annehmen? Ich * denke * meine Antwort gab die richtige Analyse, nämlich dass es die Verwendung von 'application: supportedInterfaceOrientationsForWindow:' war, die Dinge durcheinander brachte, und Sie sollten die 'unterstütztenInterfaceOrientations' des UINavigationControllers und die 'unterstütztenInterfacebedingungen 'des Modalansichtcontrollers verwenden. – matt

+1

@matt: Ich setze über Sie sagte, aber immer noch habe ich Porträt, während die View-Controller entlassen. Was muss ich in der übergeordneten Ansicht festlegen? – TamilKing