【问题标题】:iOS 11 Force UIViewController to portrait mode doesn't workiOS 11 强制 UIViewController 为纵向模式不起作用
【发布时间】:2018-02-17 20:23:16
【问题描述】:

基于 Apple 论坛上的 the discussing,此方法适用于 iOS iOS 6)

这将防止任何旋转。

- (BOOL)shouldAutorotate
{
    return NO;
}

这只会旋转到纵向(正面朝上或正面朝下)。

- (NSUInteger)supportedInterfaceOrientations
{
    return UIInterfaceOrientationMaskPortrait + UIInterfaceOrientationMaskPortraitUpsideDown;
}

但是,它不适用于 iOS 11 Beta 9;

如果您有一个允许所有方向的应用程序,但想将 MainViewController 设置为仅使用此设置。

如果您按住设备横向并启动应用程序,在启动屏幕后,状态栏将位于屏幕顶部(横向时),您的视图仍然是纵向的。

如果你使用方法切换rootViewController like this answer,你最终会得到一个横向渲染的视图,强制显示为纵向。

像这样的一些示例图:

齿轮图标的位置正确,但来自图书馆。其他一切看起来都像风景。

谢谢

【问题讨论】:

    标签: ios objective-c iphone uiviewcontroller rotation


    【解决方案1】:

    没有足够的声望点来回复@Vishal16answer...这对我有帮助。

    我想允许 iPad 上所有视图控制器的所有方向和 iPhone 上大多数视图控制器的纵向,我希望它在 swift 中,所以这是我稍微修改的版本:

    在您的应用委托中:

    var isPortrait = true
    
    func application(_ application: UIApplication, supportedInterfaceOrientationsFor window: UIWindow?) -> UIInterfaceOrientationMask {
    
        if UIDevice.current.userInterfaceIdiom == .pad || !isPortrait {
            return .all
        }
        return .portrait
    }
    


    然后在 prepare(for segue:...

        (UIApplication.shared.delegate as? AppDelegate)?.isPortrait = true
    

    在 segue 上旋转视图控制器时使用 false,其他时使用 true。

    享受吧!

    【讨论】:

      【解决方案2】:

      当您将呈现任何viewController AppDelegate 时会自动调用此方法进行强制旋转。我正在使用它,它在我的所有应用程序中都完美无缺

      AppDelegate.m

      - (UIInterfaceOrientationMask)application:(UIApplication *)application supportedInterfaceOrientationsForWindow:(UIWindow *)window
      {
         if (self.isPotrait) {
             return UIInterfaceOrientationMaskPortrait|UIInterfaceOrientationMaskPortraitUpsideDown;
         }
         return UIInterfaceOrientationMaskAll;
      }
      

      定义一个属性:

      @property (assign, nonatomic) BOOL isPotrait;
      

      在 prepareForSegue 方法调用中是这样的:

      if ([segue.identifier isEqualToString:@"segue_ID"]){
           AppDelegate *appDelegate = (AppDelegate *)[UIApplication sharedApplication].delegate;
           [appDelegate setIsPotrait:true];
           YourViewController *yourVC = [segue destinationViewController];
      }
      

      希望对您有所帮助。 快乐编码:)

      【讨论】:

      • supportedInterfaceOrientationsForWindow 似乎即使没有self.isPotrait 也能正常工作,但此调用将所有窗口设置为纵向。我们正在加载一个插页式广告,我们希望它以横向显示。我们的测试表明,如果我们将OrientationsForWindow 设置为纵向,广告将无法以横向展示。
      • 您可以使用 isPotrait 标志切换您想要的方向。如果你想返回 AllMask 或任何特定的。然后请在您弹回或关闭您的 viewController 时播放此标志,并相应地设置此标志。
      猜你喜欢
      • 2013-05-05
      • 2012-09-13
      • 1970-01-01
      • 1970-01-01
      • 2020-10-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-02-21
      相关资源
      最近更新 更多