How to force view controller orientation in iOS 8?

前端 未结 25 2062
太阳男子
太阳男子 2020-11-22 13:11

Before iOS 8, we used below code in conjunction with supportedInterfaceOrientations and shouldAutoRotate delegate methods to force app orie

相关标签:
25条回答
  • 2020-11-22 13:30

    The combination of Sids and Koreys answers worked for me.

    Extending the Navigation Controller:

    extension UINavigationController {
        public override func shouldAutorotate() -> Bool {
            return visibleViewController.shouldAutorotate()
        }
    }
    

    Then disabling rotation on the single View

    class ViewController: UIViewController {
        override func shouldAutorotate() -> Bool {
            return false
        }
    }
    

    And rotating to the appropriate orientation before the segue

    override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
        if (segue.identifier == "SomeSegue")
        {
            let value = UIInterfaceOrientation.Portrait.rawValue;
            UIDevice.currentDevice().setValue(value, forKey: "orientation")
        }
    }
    
    0 讨论(0)
  • 2020-11-22 13:30

    It looks like even thou here is so much answers no one was sufficient for me. I wanted to force orientation and then on going back go back to device orientation but [UIViewController attemptRotationToDeviceOrientation]; just did'nt work. What also did complicated whole thing is that I added shouldAutorotate to false based on some answer and could not get desired effects to rotate back correctly in all scenarios.

    So this is what I did:

    Before pushing of controller in call in his init constructor this:

    _userOrientation = UIDevice.currentDevice.orientation;
    [UIDevice.currentDevice setValue:@(UIInterfaceOrientationPortrait) forKey:@"orientation"];
    [self addNotificationCenterObserver:@selector(rotated:)
                                   name:UIDeviceOrientationDidChangeNotification];
    

    So I save last device orientation and register for orientation change event. Orientation change event is simple:

    - (void)rotated:(NSNotification*)notification {
        _userOrientation = UIDevice.currentDevice.orientation;
    }
    

    And on view dissmising I just force back to any orientation I have as userOreintation:

    - (void)onViewDismissing {
        super.onViewDismissing;
        [UIDevice.currentDevice setValue:@(_userOrientation) forKey:@"orientation"];
        [UIViewController attemptRotationToDeviceOrientation];
    }
    

    And this has to be there too:

    - (BOOL)shouldAutorotate {
        return true;
    }
    
    - (UIInterfaceOrientationMask)supportedInterfaceOrientations {
        return UIInterfaceOrientationMaskPortrait;
    }
    

    And also navigation controller has to delegate to shouldAutorotate and supportedInterfaceOrientations, but that most people already have I believe.

    PS: Sorry I use some extensions and base classes but names are quite meaningful so concept is understandable, will make even more extensions because it's not too much pretty now.

    0 讨论(0)
  • 2020-11-22 13:32

    This should work from iOS 6 on upwards, but I've only tested it on iOS 8. Subclass UINavigationController and override the following methods:

    - (UIInterfaceOrientation)preferredInterfaceOrientationForPresentation {
        return UIInterfaceOrientationLandscapeRight;
    }
    
    - (BOOL)shouldAutorotate {
        return NO;
    }
    

    Or ask the visible view controller

    - (UIInterfaceOrientation)preferredInterfaceOrientationForPresentation {
        return self.visibleViewController.preferredInterfaceOrientationForPresentation;
    }
    
    - (BOOL)shouldAutorotate {
        return self.visibleViewController.shouldAutorotate;
    }
    

    and implement the methods there.

    0 讨论(0)
  • 2020-11-22 13:32

    According to Korey Hinton's answer

    Swift 2.2:

    extension UINavigationController {
        public override func supportedInterfaceOrientations() -> UIInterfaceOrientationMask {
            return visibleViewController!.supportedInterfaceOrientations()
        }
        public override func shouldAutorotate() -> Bool {
            return visibleViewController!.shouldAutorotate()
        }
    }
    
    
    extension UITabBarController {
        public override func supportedInterfaceOrientations() -> UIInterfaceOrientationMask {
            if let selected = selectedViewController {
                return selected.supportedInterfaceOrientations()
            }
            return super.supportedInterfaceOrientations()
        }
        public override func shouldAutorotate() -> Bool {
            if let selected = selectedViewController {
                return selected.shouldAutorotate()
            }
            return super.shouldAutorotate()
        }
    }
    

    Disable Rotation

    override func shouldAutorotate() -> Bool {
        return false
    }
    

    Lock to Specific Orientation

    override func supportedInterfaceOrientations() -> UIInterfaceOrientationMask {
        return UIInterfaceOrientationMask.Portrait
    }
    
    0 讨论(0)
  • 2020-11-22 13:37

    Use this to lock view controller orientation, tested on IOS 9:

    // Lock orientation to landscape right

    -(UIInterfaceOrientationMask)supportedInterfaceOrientations {
        return UIInterfaceOrientationMaskLandscapeRight;
    }
    
    -(NSUInteger)navigationControllerSupportedInterfaceOrientations:(UINavigationController *)navigationController {
        return UIInterfaceOrientationMaskLandscapeRight;
    }
    
    0 讨论(0)
  • 2020-11-22 13:38

    I found that if it's a presented view controller, you can override preferredInterfaceOrientationForPresentation

    Swift:

    override func supportedInterfaceOrientations() -> Int {
      return Int(UIInterfaceOrientationMask.Landscape.rawValue)
    }
    
    override func preferredInterfaceOrientationForPresentation() -> UIInterfaceOrientation {
      return UIInterfaceOrientation.LandscapeLeft
    }
    
    override func shouldAutorotate() -> Bool {
      return false
    }
    
    0 讨论(0)
提交回复
热议问题