最新iOS在手机横屏的时候打开app强制竖屏

最近在做项目时需求是只有在某一个页面可以横竖屏来回切换 其他页面竖屏显示

遇到的问题是在手机横屏的状态下 打开app 页面是错乱的,

下面是我的解决方案
1、在Xcode中进行设置


w1.png

2、在AppDelegate.h中添加旋转属性

/**
 *  是否允许转向
 */
@property(nonatomic,assign)BOOL allowRotation; // 是否允许转向

在AppDelegate.m中添加转屏的代理方法

- (UIInterfaceOrientationMask)application:(UIApplication *)application supportedInterfaceOrientationsForWindow:(nullable UIWindow *)window
{
    //  如果设置了allowRotation属性,支持全屏
    if (_allowRotation == YES) {
        return UIInterfaceOrientationMaskAll;
    }else{
        return UIInterfaceOrientationMaskPortrait;//默认全局不支持横屏
    }
}

3、基类navigation代码:

- (BOOL)shouldAutorotate {
    return self.topViewController.shouldAutorotate;
}
 
- (UIInterfaceOrientationMask)supportedInterfaceOrientations {
    return self.topViewController.supportedInterfaceOrientations;
}
 
- (UIInterfaceOrientation)preferredInterfaceOrientationForPresentation {
    return self.topViewController.preferredInterfaceOrientationForPresentation;
}

4、项目里写了一个公共的UIViewController,名字为BaseViewController,创建的BaseViewController继承UIViewController 在该viewController里进行了如下设置:

-(BOOL)shouldAutorotate{
    
    return YES;
}
- (UIInterfaceOrientationMask)supportedInterfaceOrientations
{
    return UIInterfaceOrientationMaskPortrait;
}
- (UIInterfaceOrientation)preferredInterfaceOrientationForPresentation
{
    return UIInterfaceOrientationPortrait;
}

-(BOOL)shouldAutorotate这个方法是重点 如果设置为NO,在横屏手机的状态下打开app页面还是错乱的
5、如果你的应用的根控制器是TabVC,就把下面这段代码放到TabVC根控制器下,

- (BOOL)shouldAutorotate{
    return self.selectedViewController.shouldAutorotate;
}
- (UIInterfaceOrientationMask)supportedInterfaceOrientations {
    return self.selectedViewController.supportedInterfaceOrientations;
}

- (UIInterfaceOrientation)preferredInterfaceOrientationForPresentation {
    return self.selectedViewController.preferredInterfaceOrientationForPresentation;
}

这里就实现了横屏状态下打开app竖屏展示的效果。
如果想在某一个页面里进行横竖屏切换,可以进行如下设置

-(void)viewWillAppear:(BOOL)animated
{
    [super viewWillAppear:animated];
    [SimplifyAnswerAppDelegate sharedInstance].allowRotation = YES;
}
- (void)viewWillDisappear:(BOOL)animated {
    [super viewWillDisappear:animated];
    [SimplifyAnswerAppDelegate sharedInstance].allowRotation = NO;
}

[SimplifyAnswerAppDelegate sharedInstance]是我在appdelegate里面写的一个类方法,SimplifyAnswerAppDelegate是我把appDelegate进行了重新命名,具体方法实现如下:

+ (SimplifyAnswerAppDelegate *)sharedInstance {
    return (SimplifyAnswerAppDelegate *)[UIApplication sharedApplication].delegate;
}

如果是用的APPDelegate,可以这么写

AppDelegate * appDelegate = (AppDelegate *)[UIApplication sharedApplication].delegate;
 appDelegate.allowRotation = NO;  // 关闭横屏仅允许竖屏

到这里就实现了前面说的所有页面默认竖屏,部分页面横屏显示的需求。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 原文链接https://my.oschina.net/huqiji/blog/3031940第一种方法会出现无法转...
    it彭于晏阅读 3,451评论 1 7
  • 第一种解决方案(不推荐,直接跳过看第二种解决方案): 需求: 强制横竖屏,在某些情况下非常重要,在网上找了好多解决...
    sumrain_cloud阅读 1,370评论 4 1
  • 第一步 首先保证工程支持横竖屏 不多说看图 保证圈红的地方 打对勾 58F678EC-EABC-4320-9FCB...
    ylgwhyh阅读 1,874评论 0 1
  • 前言 很长时间没有更新简书,原因不多说(因为懒),最近比较清闲,想起来写一篇文章来说一下iOS横竖屏轻松切换的过程...
    Fly_Sunshine_J阅读 3,249评论 3 4
  • 项目APP中总会遇到某些页面需要横屏展示,其他页面默认竖屏展示。所以总结了一套自己使用的横竖屏方法。 首先我查看U...
    小志Shannon阅读 481评论 0 3