InterfaceOrientation für einen bestimmten View erlauben

Matak

Braeburn
Registriert
08.02.13
Beiträge
46
Hi,

ich möchte meine iPadApp für Landscape bauen. Nur einem bestimmten ViewController möchte ich auch den Portraitmodus erlauben und wenn ich wieder zurückgehe, soll er wieder in Landscape wechseln.

Ich arbeite mit dem Storyboard und habe in den Deployment Infos nur Landscape Left und Right angehakt.

was ich da schon versucht habe:

-(BOOL)shouldAutorotate
{
returnYES;
}

- (BOOL)shouldAutorotateToInterfaceOrientation: (UIInterfaceOrientation)toInterfaceOrientation {
returnYES;
}

-(NSUInteger)supportedInterfaceOrientations
{
returnUIInterfaceOrientationMaskAll;
}

Viele Grüße
Matak
 

MacApple

Schöner von Bath
Registriert
05.01.04
Beiträge
3.652
Die Methode shouldAutorotateToInterfaceOrientation: brauchst du nur, wenn du iOS Versionen kleiner 6.0 unterstützen willst. shouldAutorotate brauchst du auch nicht zu überschreiben, denn die Defaultimplementierung gibt YES zurück. Das erstmal vorweg.

Zum eigentlichen Problem. In den Deployment Infos musst du alle Orientierungen erlauben, die in deiner App vorkommen können und in den jeweiligen ViewControllern musst du dann die Einschränkung der Orientierungen in supportedInterfaceOrientations vornehmen.
 

Matak

Braeburn
Registriert
08.02.13
Beiträge
46
Das habe ich schon versucht. Trotzdem kann ich alle Views dann auf Portrait drehen :/

-(NSUInteger)supportedInterfaceOrientations
{
returnUIInterfaceOrientationMaskLandscapeLeft | UIInterfaceOrientationMaskLandscapeRight;
}

und

-(NSUInteger)supportedInterfaceOrientations
{
UIInterfaceOrientationMaskLandscape
}

beide versucht.
 

MacApple

Schöner von Bath
Registriert
05.01.04
Beiträge
3.652
Dann vermute ich mal, dass die ViewController alle in einem NavigationController stecken, richtig?
 

MacApple

Schöner von Bath
Registriert
05.01.04
Beiträge
3.652
Dann musst du eine Subklasse von UINavigationController erstellen und diese verwenden. In dieser Subklasse überschreibst du dann supportedInterfaceOrientations wie folgt:

Code:
-(NSUInteger)supportedInterfaceOrientations {
    return [self.topViewController supportedInterfaceOrientations];
}

Warum du das so machen musst, ist in der Dokumentation zu UIViewController im Abschnitt „Handling View Rotations“ beschrieben.
 

Matak

Braeburn
Registriert
08.02.13
Beiträge
46
Ich habe noch ein weiteres Problem.. im NavigationController funktioniert es.. jetzt habe ich allerdings ein TabBarController drumgebaut.. und es funktioniert nicht mehr.

Was ich schon versucht habe:

-(UIInterfaceOrientation)tabBarControllerPreferredInterfaceOrientationForPresentation:(UITabBarController *)tabBarController

{
returnUIInterfaceOrientationLandscapeLeft | UIInterfaceOrientationLandscapeRight;
}


-(NSUInteger)tabBarControllerSupportedInterfaceOrientations:(UITabBarController *)tabBarController

{
return [self.presentingViewControllersupportedInterfaceOrientations];
}



-(BOOL)shouldAutorotate

{
returnNO;
}


Wäre echt nett, wenn noch mal jemand helfen könnte :)

Ach und Danke an MacApple, habe ich letztes mal irgendwie vergessen zu schreiben!
 

MacApple

Schöner von Bath
Registriert
05.01.04
Beiträge
3.652
Das sind beides Delegate Methoden. Hast du diese denn auch im Delegate des TabBarControllers implementiert? Und wenn du bei shouldAutorotate NO zurück gibst, dreht sich ja gar nichts mehr.
 

Matak

Braeburn
Registriert
08.02.13
Beiträge
46
Ja, den Delegate habe ich gesetzt und mit shouldAutorotate YES dreht sich alles
 

Matak

Braeburn
Registriert
08.02.13
Beiträge
46
Es soll sich ja nur ein bestimmter ViewController drehen. Jetzt ist es so, dass sich entweder all oder keiner dreht
 

MacApple

Schöner von Bath
Registriert
05.01.04
Beiträge
3.652
Nun, da musst du einfach, wie beim UINavigationController, den geraden angezeigten ViewController befragen.

Code:
- (NSUInteger)tabBarControllerSupportedInterfaceOrientations:(UITabBarController *)tabBarController {
    return [tabBarController.selectedViewController supportedInterfaceOrientations];
}
 

Matak

Braeburn
Registriert
08.02.13
Beiträge
46
Hm ne es lassen sich trotzdem noch alle drehen
 

MacApple

Schöner von Bath
Registriert
05.01.04
Beiträge
3.652
Dann hast du die Methode tabBarControllerSupportedInterfaceOrientations: nicht im Delegate des UITabBarControllers implementiert oder das Delegate nicht gesetzt.
 

Matak

Braeburn
Registriert
08.02.13
Beiträge
46
Es funktioniert noch nicht ganz.. Ich habe jetzt nur noch den NavigationController.

Wenn ich die App starte, wechselt es ohne Probleme in Landscape. Wenn ich allerdings aus dem View, der Portrait kann, zurück gehe, wechselt die App nicht in Landscape modus