iOS 开发_屏幕旋转的那些坑儿事

【作者前言】:13年入圈,分享些本人工作中遇到的点点滴滴那些事儿,17年刚开始写博客,高手勿喷!以分享交流为主,欢迎各路豪杰点评改进!

1.应用场景:

项目中如涉及视频、直播等功能,经常会用到屏幕旋转的功能进行全屏浏览,但为了提升用户体验、节省开发周期和成本等,有些视图却并不需要支持旋转,需要独立来控制以满足业务需求。

2.实现目标:

开启系统的自动旋转后,通过代码来手动控制某些独立界面的旋转问题。

3.代码说明:

方法一:【网上千篇一律的方法,但是介绍并不多,在这为了方便迅速解决问题,简明扼要的介绍一下,此方法太麻烦?!莫慌!后面有非常简单的方法哦!!!】

Tip:此处有雷区!!!经测试,并不是说直接重写这两个方法就一定会有效果的!因为实际工程中经常会有这样的控制器层级结构:UITabBarController - UINavigationController - UIViewController,这样的控制器结构就需要一层一层的响应,优先级设置顺序Tab-Nav-VC! 如:Tab上设置了不支持设备旋转,则Nav-VC怎么设置都没有效果!
这里举个例子,目的是将旋转的方法最终传递到VC控制器中,让VC中的方向代码生效!具体可根据实际情况进行阻断和传递。

/**在TabViewController中重写方法  可用类扩展直接重写
*/
// 是否支持自动转屏
- (BOOL)shouldAutorotate {
    UIViewController *vc = self.viewControllers[self.selectedIndex];
    if ([vc isKindOfClass:[UINavigationController class]]) {
        UINavigationController *nav = (UINavigationController *)vc;
        return [nav.topViewController shouldAutorotate];
    } else {
        return [vc shouldAutorotate];
    }
}
// 支持哪些屏幕方向
- (UIInterfaceOrientationMask)supportedInterfaceOrientations {
    UIViewController *vc = self.viewControllers[self.selectedIndex];
    if ([vc isKindOfClass:[UINavigationController class]]) {
        UINavigationController *nav = (UINavigationController *)vc;
        return [nav.topViewController supportedInterfaceOrientations];
    } else {
        return [vc supportedInterfaceOrientations];
    }
}
// 优先显示的屏幕方向(默认的屏幕方向),及只有在RootViewController和当前ViewController必须是通过模态出来的UIViewController(模态带导航的无效)方式展现出来的,才会调用这个方法
- (UIInterfaceOrientation)preferredInterfaceOrientationForPresentation {
    UIViewController *vc = self.viewControllers[self.selectedIndex];
    if ([vc isKindOfClass:[UINavigationController class]]) {
        UINavigationController *nav = (UINavigationController *)vc;
        return [nav.topViewController preferredInterfaceOrientationForPresentation];
    } else {
        return [vc preferredInterfaceOrientationForPresentation];
    }
}
/**在NavigationController中重写方法  可用类扩展直接重写
*/
// 是否支持自动转屏
- (BOOL)shouldAutorotate {
    return [self.topViewController shouldAutorotate];
}
// 支持哪些屏幕方向
- (UIInterfaceOrientationMask)supportedInterfaceOrientations {
    return [self.topViewController supportedInterfaceOrientations];
}
// 优先显示的屏幕方向(默认的屏幕方向),及只有在RootViewController和当前ViewController必须是通过模态出来的UIViewController(模态带导航的无效)方式展现出来的,才会调用这个方法
- (UIInterfaceOrientation)preferredInterfaceOrientationForPresentation {
    return [self.topViewController preferredInterfaceOrientationForPresentation];
}

之后再在对应的需要控制旋转的VC中重写下面的方法

/**是否允许屏幕旋转
注:只有在该方法返回YES时,下面的方法才会被调用
*/
- (BOOL)shouldAutorotate
{
    return YES;
}
/**屏幕支持旋转的方向
在设备屏幕旋转时,系统会调用 
-(BOOL)shouldAutorotate 方法去检查当前界面是否支持旋转,
只有 -(BOOL)shouldAutorotate 返回 YES 的时候,
-(NSUInteger)supportedInterfaceOrientations 方法才会被调用,
从而确定是否需要旋转界面。
*/
- (NSUInteger)supportedInterfaceOrientations
{
    return (UIInterfaceOrientationMaskAll);
}
// 优先显示的屏幕方向(默认的屏幕方向),及只有在RootViewController和当前ViewController必须是通过模态出来的UIViewController(模态带导航的无效)方式展现出来的,才会调用这个方法
- (UIInterfaceOrientation)preferredInterfaceOrientationForPresentation {
    return UIInterfaceOrientationPortrait;
}
/**
在iOS5.1及之前通过下面的一个方法即可达到对页面旋转的控制;
但iOS6之后,此方法已经被废弃,目前市面基本已经放弃了兼容iOS6,所以只是做个简单介绍,扩宽下知识层面
*/
/*
- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
{
    return (interfaceOrientation == UIInterfaceOrientationPortrait);
}
*/

方法一太繁琐了???好麻烦哦!~没关系,往下看!方法二傻瓜级的方法定能助你完成功能!

方法二:在 iOS 6 中,UIApplicationDelegate 协议中添加了一个可以指定 UIWindow 中的界面的屏幕方向的方法:
  • (NSUInteger)application:(UIApplication *)application
    supportedInterfaceOrientationsForWindow:(UIWindow *)window;
利用好此方法,我们就能够快速解决单独界面的旋转支撑问题!
/**第一步:在AppDelegate或者其Category中的.h文件中添加属性:
isAllowRotation
属性解释:是否允许屏幕旋转
*/
/** 是否支持屏幕旋转*/
@property(nonatomic,assign)BOOL isAllowRotation;

/**第二步:在AppDelegate或者其Category中的.m文件中
添加实现上面iOS 6新增的方法*/
- (NSUInteger)application:(UIApplication *)application supportedInterfaceOrientationsForWindow:(UIWindow *)window
{
    if (self.isAllowRotation) //支持程序允许的全部旋转
        return UIInterfaceOrientationMaskAll;
    else//不支持旋转,即只能竖屏
    return UIInterfaceOrientationMaskPortrait;
}
/**实际应用
这里本不想写了...但为了把 “复制粘贴” 的程序精神发扬光大,还是写一写吧(😁😁😁)
*/
//在支持旋转的VC中导入头文件:
#import "AppDelegate.h"
//并调用一下支持旋转的方法:
[(AppDelegate *)[UIApplication sharedApplication].delegate setIsAllowRotation:YES];

/**_______________华丽的分界线_____________________*/
//在不支持旋转的VC中导入头文件:
#import "AppDelegate.h"
//并调用一下不支持旋转的方法:
[(AppDelegate *)[UIApplication sharedApplication].delegate setIsAllowRotation:NO];

/**更多情况下是指在独立的VC中同时使用,
如我的项目使用场景为:进入播放视频/视讯直播页之后
支持旋转,离开此页面后不支持旋转*/
//在VC的生命周期函数中调用即可(viewWillAppear --- viewWillDisappear等)
方法三:【下下策...也是最暴力的,通过KVC强制设置方向】
-(void)viewWillAppear:(BOOL)animated{
     /** 先将设备方向设置为:UIInterfaceOrientationUnknown,
避免出现直接设置无效的BUG*/
    NSNumber *orientationUnknown = [NSNumber numberWithInt:UIInterfaceOrientationUnknown];
    [[UIDevice currentDevice] setValue:orientationUnknown forKey:@"orientation"];
    /** 然后在设置成想要变成的方向*/
    NSNumber *orientationTarget = [NSNumber numberWithInt:UIInterfaceOrientationLandscapeLeft];
    [[UIDevice currentDevice] setValue:orientationTarget forKey:@"orientation"];
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,591评论 6 501
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,448评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,823评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,204评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,228评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,190评论 1 299
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,078评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,923评论 0 274
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,334评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,550评论 2 333
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,727评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,428评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,022评论 3 326
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,672评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,826评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,734评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,619评论 2 354

推荐阅读更多精彩内容