iOS 屏幕旋转终极方案 兼容iOS13以下版本与iOS14以上版本的区别

苹果的屏幕旋转,iOS13以下版本和iOS14以上版本会有版本差异,现在对不同情况进行区分。这些方案兼顾了用户强制开启横屏。

方案的整体更改设置:设备的旋转方向都勾选上

image.png

情况一、整体竖屏,小部分横屏 并且rootView是navigationController

这样相当于没有tabbar,rootView只是navigationController。
我们创建一个项目的baseNavigationController

1、baseNavigationController的配置

#import "LXKBaseNavController.h"

@implementation LXKBaseNavController.h

- (void)viewDidLoad {
    [super viewDidLoad];
}

///设置默认只支持竖屏
- (UIInterfaceOrientationMask)supportedInterfaceOrientations {
    return UIInterfaceOrientationMaskPortrait;
}
@end

这样我们的页面都是竖屏显示,那么当部分页面需要横屏展示怎么办?
其实很简单,我们只需要在横屏页面重写支持方向的方法即可

2、需要旋转的VC的配置

#import "LXKRootViewController.h"

@implementation LXKRootViewController.h


- (void)viewDidLoad {
    [super viewDidLoad];
 
}

#pragma mark - Orientation
///屏幕是否支持自动旋转,yes
- (BOOL)shouldAutorotate {
    return YES;
}

///页面选择默认方向
- (UIInterfaceOrientation)preferredInterfaceOrientationForPresentation {
    return UIInterfaceOrientationLandscapeRight;
}
//页面支持的旋转方向
- (UIInterfaceOrientationMask)supportedInterfaceOrientations {
    return UIInterfaceOrientationMaskLandscape;
}

这样,我们的页面就可以正常旋转啦

情况二、整体竖屏,小部分横屏 并且rootView是TabbarViewController,tabbar下是NavigationController。

我们大部分app应该都是这种结构,其实原理和情况一差不多。
首先,在我们创建的tabbar中写入下面的方法
其次,再在navigationController中写入方案一的方法。注意,tabbar的navi一定要用方案一中定义方法了的navi

1、Tabbar的设置:

import UIKit
class LXKTabBarViewController: UITabBarController ,UITabBarControllerDelegate{
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
      //  self.setChildVC()
       // self.delegate = self
       // self.setTabbarPro()
    }

    //是否自动旋转:需要横屏的视图控制器中覆写此方法,返回YES
    override var shouldAutorotate: Bool {
        return true
    }

    //支持哪些屏幕方向:只支持竖屏
    override var supportedInterfaceOrientations: UIInterfaceOrientationMask {
        return .portrait
    }

    //默认方向:只支持正常竖屏
    override var preferredInterfaceOrientationForPresentation: UIInterfaceOrientation {
        return .portrait
    }

    override var prefersStatusBarHidden: Bool {
        return false
    }
    
    override var preferredStatusBarStyle: UIStatusBarStyle {
        return .default
    }
    
    override var preferredStatusBarUpdateAnimation: UIStatusBarAnimation {
        return .slide
    }
}

tabbar就配置好了。
接下来就是配置NavigationController,和方案一中的配置一样:

2、navigationController的配置

#import "LXKBaseNavController.h"

@implementation LXKBaseNavController.h

- (void)viewDidLoad {
    [super viewDidLoad];
}

///设置默认只支持竖屏
- (UIInterfaceOrientationMask)supportedInterfaceOrientations {
    return UIInterfaceOrientationMaskPortrait;
}
@end

3、需要旋转的VC的配置

#import "LXKRootViewController.h"

@implementation LXKRootViewController.h


- (void)viewDidLoad {
    [super viewDidLoad];
 
}

#pragma mark - Orientation
///屏幕是否支持自动旋转,yes
- (BOOL)shouldAutorotate {
    return YES;
}

///页面选择默认方向
- (UIInterfaceOrientation)preferredInterfaceOrientationForPresentation {
    return UIInterfaceOrientationLandscapeRight;
}
//页面支持的旋转方向
- (UIInterfaceOrientationMask)supportedInterfaceOrientations {
    return UIInterfaceOrientationMaskLandscape;
}

到这来就结束啦,其实梳理完旋转关系,还是很简单的。

你可能感兴趣的:(iOS 屏幕旋转终极方案 兼容iOS13以下版本与iOS14以上版本的区别)