需求是这样的:
在控制器A中, 不允许转屏, 只能是竖屏
push到控制器B之后, 允许控制器自动转屏幕

实现方式

正常的实现逻辑中, 只需要在控制器A中实现以下

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

就可以实现了

但是今天遇到这么个问题, 无论怎么设置, 这些代码也执行, 但是都不起作用, 屏幕依然可以旋转.

问题

大概的查了一下, 跟UINavigationController, UITabBarController相关的控制器, 会默认的走这两个基类的转屏方法, 自己写的这个就不会生效了, 检查appDelegate中发现如下代码:

    LCPlayerViewController *mainViewController = [[LCPlayerViewController alloc] initWithNibName:@"LCPlayerViewController"bundle:nil];UINavigationController *navigationController = [[UINavigationController alloc] initWithRootViewController:mainViewController];navigationController.navigationBarHidden = YES;self.navigationController = navigationController;self.window.rootViewController = self.navigationController;[self.window makeKeyAndVisible];return YES;

解决方法

由于基本是UINavigationController, 所以跟上面说的那个一致, 自己实现的shouldAutorotate等方法不管用了, 于是解决办法如下:

    LECBaseNavigationController *navigationController = [[LECBaseNavigationController alloc] initWithRootViewController:mainViewController];

把创建的Nav变成了自己的一个Nav子类, 定义如下:

#import "LECBaseNavigationController.h"@interface LECBaseNavigationController ()@end@implementation LECBaseNavigationController- (void)viewDidLoad {[super viewDidLoad];
}- (BOOL)shouldAutorotate {return self.topViewController.shouldAutorotate;
}- (UIInterfaceOrientationMask)supportedInterfaceOrientations {return self.topViewController.supportedInterfaceOrientations;
}- (UIInterfaceOrientation)preferredInterfaceOrientationForPresentation {return self.topViewController.preferredInterfaceOrientationForPresentation;
}@end

重写了三个跟转屏相关的方法, 把转屏的控制归还给实际的控制器, 再编译运行, 就可以实现自己的控制器控制自己转屏方向了.
代码在这

https://github.com/dfzr86/ScreenOrientationsDemo

作者:__zimu
链接:https://www.jianshu.com/p/1c8d71deded8
來源:简书
简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。

iOS开发 转屏控制 (shouldAutorotate/supportedInterfaceOrientations)不起作用相关推荐

  1. T语言与快速开发平台之天宇联iOS开发手册

    天宇联IOS开发手册 控制包ttyu.controller 1.    通用类Command 方法 说明 - (voidGetFunctionValue (NSString *dataMember) ...

  2. iOS开发Swift篇—(六)流程控制

    iOS开发Swift篇-(六)流程控制 一.swift中的流程控制 Swift支持的流程结构如下: 循环结构:for.for-in.while.do-while 选择结构:if.switch 注意:这 ...

  3. iOS 开发 高级:通过AirServer使用AirPlay镜像并实现多屏幕显示控制

    AirPlay是iOS中一个很酷的功能,通过Wi-Fi连接支持AirPlay的设备,然后使用镜像功能就能在其他设备显示内容,播放声音.有很多大型的游戏都支持AirPlay,这样比如连接电视时,那么iP ...

  4. iOS开发中屏幕旋转(二)

    Morris_ 2019.04.11 前面有总结过一些在开发中遇到的屏幕旋转的基础知识. 一.设置应用支持的转屏方向 设置方式 00x1 在TARGET->General->Deploym ...

  5. iOS开发中屏幕旋转(一)

    Morris_ 2018.11.24 前言 最近做一个关于在线视频互动的iPad项目,部分界面只要横屏,部分界面可以横竖屏转换.看了看别家做的项目,有些是只做竖/横屏,有些是支持了横竖屏转换,在iPa ...

  6. iOS开发常用代码片段:总有你用得上的功能

    使用方法:查看文章目录,查找需要的功能. 代码片段目录 1.禁止手机睡眠 2. 隐藏某行cell 3.禁用button高亮 4..切换window的根控制器 5.去除数组中重复的对象 6.给一个vie ...

  7. iOS开发系列–音频播放、录音、视频播放、拍照、视频录制

    iOS开发系列–音频播放.录音.视频播放.拍照.视频录制 - KenshinCui - 博客园 代码改变世界 Posts - 69, Articles - 0, Comments - 1004 Cnb ...

  8. iOS开发UI篇—transframe属性(形变)

    iOS开发UI篇-transframe属性(形变) 1. transform属性 在OC中,通过transform属性可以修改对象的平移.缩放比例和旋转角度 常用的创建transform结构体方法分两 ...

  9. iOS开发——手势识别器(用手势实现图片旋转和缩小放大)

    iOS开发中,除了有关触摸的这组方法来控制用户的手指触控外,还可以用UIGestureRecognize的衍生类来进行判断,方便了开发. UIGestureRecognize的子类类别有以下几种: U ...

最新文章

  1. 使用Wireshark进行DNS协议解析
  2. So Hot ?快给 CPU 降降温!
  3. Linux C编程Makefile编写初步-转
  4. MySQL入门第三天(下)——存储过程与存储引擎
  5. CTFHUB Web前置技能 题解记录(HTTP部分)
  6. 苹果iPad手机如何无线投屏电脑使用教程
  7. 计算机基础access2010实训,大学计算机基础access实验.doc
  8. 哪个软件可以玩java游戏_安卓java模拟器?安卓手机如何玩JAVA游戏以及JAVA软件的方法...
  9. 好员工为什么离你而去
  10. java 读取文本_Java如何读取txt文件的内容?
  11. 服务器按f11才能进系统,电脑每次开机都需要按f11进入选择开启项才能开启系统,...
  12. 小白Mac C/C++ for Visual Studio Code配置
  13. 微信小程序 五 npm 包 、安装 vant组件、promise组件、全局数据共享、 分包!!!、自定义 tabBar 案例
  14. VNC Viewer建立多个图形界面,来远程访问同一个服务器(Ubuntu)
  15. 专知 2019/4/24(图像填充方法大全)
  16. V4L2视频驱动框架---v4l2_device管理模块简述
  17. 自动挡汽车开车教程,这十点要铭记在心
  18. 用Prophet预测USDCNY走势--------仿照forecasting-stock-perfomance-with-prophet对美元人民币走势进行预测
  19. [UOJ#207]共价大爷游长沙
  20. SHARP GP2Y1014笔记

热门文章

  1. 设计师学python有意义吗-如果你有设计师朋友,请对TA好一些...
  2. Shapes布局-文字环绕动画
  3. python wx.frame框架属性
  4. WPF入门第四篇 WPF模板
  5. python编写贪吃蛇游戏下载,python实现简单的贪吃蛇游戏
  6. Liferay好文收集
  7. BS(Brower/Server)浏览器/服务器 和 C/S (Client/Server)客户端/服务器 的区别
  8. HMM的概述(五个基本元素、两个假设、三个解决的问题)
  9. EMC (电磁兼容性)
  10. C# 窗体制作Aero效果