nur 1 VC in landsacpe

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • nur 1 VC in landsacpe

    Ich habe eine App die bis jetzt nur im landscape zu nutzen war.
    bis auf genau einen VC kann es auch durchaus sinnvoll sein, die App auch im Porträt zu nutzen.
    Die Umstellung auf "sowohl Porträt als auch Landscape" ist überschaubar und würde dem user an verschieden Stellen mehr nutzen bringen.

    Aber es gibt einen VC, der ist nicht im Porträt darstellbar.

    Wie mache ich das, dass der VC nur imn landscape angezeigt wird, egal wie der user sein Device dreht ?

    Hab natürlich auch hier im Forum gesucht, aber so etwas funktioniert leider nicht.

    C-Quellcode

    1. - (void)viewDidLoad
    2. {
    3. [super viewDidLoad];
    4. [[UIDevice currentDevice] setValue:[NSNumber numberWithInt:UIDeviceOrientationLandscapeLeft] forKey:@"orientation"];
    5. UIDevice *device = [UIDevice currentDevice];
    6. }
    Der Debugger gibt mir für device.orientation UIDeviceOrientationPortrait

    Hat jemand eine Idee? wie ich das lösen könnte
    Ich habe auch keine Loesung, aber ich bewundere das Problem!
    _____________________________________________________


    Hape42
  • Moin!

    Kann es sein, dass der o.g. View-Controller eigentlich in einen anderen - z. B. einen NavigationVC - eingebunden ist? Dann muss Du m. W. diesen Container subclassen und dessen Orientierung wie oben zuweisen. BTW, ich nehme an, das Setzen von device geschieht nur für‘s Debugging … oder sollte nach oben rutschen und auch benutzt werden ;)

    Grundsätzlich ist shouldAutorotate aber gesetzt?

    Schöne Festtage, Mattes
    Diese Seite bleibt aus technischen Gründen unbedruckt.
  • MyMattes schrieb:

    BTW, ich nehme an, das Setzen von device geschieht nur für‘s Debugging
    jup, sonst war es umständlich zu Debuggen <X

    MyMattes schrieb:

    Grundsätzlich ist shouldAutorotate aber gesetzt?

    C-Quellcode

    1. -(BOOL) shouldAutorotate
    2. {
    3. return NO;
    4. }
    5. - (UIInterfaceOrientationMask)supportedInterfaceOrientation
    6. {
    7. return UIInterfaceOrientationMaskLandscape;
    8. }
    Was ich halt hier so als versuche von anderen das hinzubekommen gefunden habe.


    MyMattes schrieb:

    Kann es sein, dass der o.g. View-Controller eigentlich in einen anderen - z. B. einen NavigationVC - eingebunden ist?
    oh, das ist aber mal ein guter Hinweis :thumbup:

    Das wird wohl das Problem sein. Ich werde mal weiter forschen

    Euch auch schöne Festtage
    Ich habe auch keine Loesung, aber ich bewundere das Problem!
    _____________________________________________________


    Hape42

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von hape42 ()

  • hape42 schrieb:

    C-Quellcode

    1. -(BOOL) shouldAutorotate
    2. {
    3. return NO;
    4. }
    5. - (UIInterfaceOrientationMask)supportedInterfaceOrientation
    6. {
    7. return UIInterfaceOrientationMaskLandscape;
    8. }
    Müsste nicht shouldAutorotate ein YES liefern, damit die entsprechenden Methoden überhaupt angesprungen werden - selbst wenn die Orientierung dann eine Formatänderung verbietet?

    Jetzt bin ich aber endgültig auf dünnem Eis :)

    Mattes
    Diese Seite bleibt aus technischen Gründen unbedruckt.
  • Ich verwende dafür die Methode application(_:supportedInterfaceOrientationsFor:) im Application Delegate.

    Je nach aktuell angezeigtem View Controller kannst Du für Deine App dann UIInterfaceOrientationMask.portrait oder UIInterfaceOrientationMask.all zurück geben.

    Der aktuell angezeigte View Controller lässt sich z.B. so ermitteln:

    Quellcode

    1. func topViewControllerWithRootViewController(rootViewController: UIViewController!) -> UIViewController? {
    2. if (rootViewController == nil) { return nil }
    3. if (rootViewController.isKind(of: UITabBarController.self)) {
    4. return topViewControllerWithRootViewController(rootViewController: (rootViewController as! UITabBarController).selectedViewController)
    5. } else if (rootViewController.presentedViewController != nil && rootViewController.presentedViewController?.isBeingDismissed == false) {
    6. return topViewControllerWithRootViewController(rootViewController: rootViewController.presentedViewController)
    7. } else if (rootViewController.isKind(of: UINavigationController.self)) {
    8. return topViewControllerWithRootViewController(rootViewController: (rootViewController as! UINavigationController).topViewController)
    9. }
    10. return rootViewController
    11. }
    Alles anzeigen
    Je nach verwendeten View Controllern kannst Du den Code noch entsprechend anpassen. ;)
  • MCDan schrieb:

    Ich verwende dafür die Methode application(_:supportedInterfaceOrientationsFor:) im Application Delegate.
    Hey, besser spät als nie:

    Danke für die beiden Tipps - Delegate-Methode und rekursives Ermitteln des "obersten" ViewControllers. @hape42 und ich habe das heute mal probiert: Funktioniert, sehr clean und der Code liegt schön zentral an einer Stelle im AppDelegate.

    Grüße, Mattes :)
    Diese Seite bleibt aus technischen Gründen unbedruckt.
  • @MCDan vielen Dank für Deinen Tipp.

    Ich poste hier mal noch die Lösung in Objective C für diejenigen die das , wie ich, nicht so schnell von Swift übersetzen können:

    die folgenden Codeschnipsel einfach ins AppDelegate und schon funktioniert das alles.

    C-Quellcode

    1. - (UIViewController *)topViewControllerWithRootViewController:(UIViewController *)rootViewController
    2. {
    3. // Walking recursively through view hierarchie to identify top-most view controller
    4. if (rootViewController == nil) return nil;
    5. if ([rootViewController isKindOfClass:UITabBarController.class])
    6. {
    7. return [self topViewControllerWithRootViewController:((UITabBarController *)rootViewController).selectedViewController];
    8. }
    9. else if ([rootViewController isKindOfClass:UINavigationController.class])
    10. {
    11. return [self topViewControllerWithRootViewController:((UINavigationController *)rootViewController).topViewController];
    12. }
    13. else if ((rootViewController.presentedViewController != nil) && rootViewController.presentedViewController.isBeingDismissed == FALSE)
    14. {
    15. return [self topViewControllerWithRootViewController:rootViewController.presentedViewController];
    16. }
    17. return rootViewController;
    18. }
    Alles anzeigen




    C-Quellcode

    1. - (UIInterfaceOrientationMask)application:(UIApplication *)application supportedInterfaceOrientationsForWindow:(UIWindow *)window
    2. {
    3. UIInterfaceOrientationMask orientationMask = UIInterfaceOrientationMaskLandscape;
    4. UIViewController *currentViewController = [self topViewControllerWithRootViewController:self.window.rootViewController];
    5. NSLog(@"CurrentVC: %@", currentViewController);
    6. if (currentViewController.class == GameLoungeCV.class) orientationMask = UIInterfaceOrientationMaskAll;
    7. // if (currentViewController.class == UIAlertController.class) orientationMask = UIInterfaceOrientationMaskAll;
    8. if(currentViewController.view.tag == 42) orientationMask = UIInterfaceOrientationMaskAll;
    9. return orientationMask;
    10. }
    Alles anzeigen
    In der obigen Methode jetzt einfach die ViewController auflisten (wie in meinem Beispiel GameLoungeCV) , die nicht "nur" landscape anzeigen sollen.

    Bei der Umsetzung bin ich noch über UIAlertController gefallen.
    Wenn ich den oben nicht mit aufnehme, dreht sich der VC wieder in landscape wenn der UIAlertController aufgerufen wird.
    Wenn ich den mit aufnehme, drehen sie alle ViewController die einen UIAlertController aufrufen, obwohl sie oben nicht aufgelistet werden.
    Ich habe das so gelöst, indem ich UIAlertController.view.tag einen Wert gegeben habe und den konkret abfrage.
    Ich habe auch keine Loesung, aber ich bewundere das Problem!
    _____________________________________________________


    Hape42