前言

相信很多人都遇到屏幕旋转的的问题,尤其push方法推出控制器的view的时候,很遇到很多的问题,我之前遇到问题就是很坑的问题,连续反复push方法、pop方法推出和退出需要横屏控制器的显示的时候,就会返回的时候出现横屏显示着怎么也看不出来是哪里的问题。


问题

开始屏幕是这样的

点击进入之后是是这样的

然后反复点击几次退出进入之后返回屏幕还是一直横屏,并没有竖起屏幕,一直都找不到什么原因


解决办法以及细节代码设置

push进去的控制器肯定要支持横屏,所以必须要有这句话

设置可以旋转
- (BOOL)shouldAutorotate{return YES;
}
支持的旋转方向
-(UIInterfaceOrientationMask)supportedInterfaceOrientations{return UIInterfaceOrientationMaskAll;
}
默认的方向
-(UIInterfaceOrientation)preferredInterfaceOrientationForPresentation{return UIInterfaceOrientationLandscapeLeft;}

同理的实现push方法的控制器的肯定不支持横屏

-(BOOL)shouldAutorotate
{  //允许旋转return NO;
}
-(UIInterfaceOrientationMask)supportedInterfaceOrientations
{   return UIInterfaceOrientationMaskPortrait;
}
-(UIInterfaceOrientation)preferredInterfaceOrientationForPresentation
{   // 返回nav栈中最后一个对象,坚持旋转的方向return UIInterfaceOrientationPortrait;
}

既然要旋转屏幕什么时候旋转是个问题,我们必须知道屏幕方向的改变吧,所以肯定添加观察者来监控屏幕的方向的改变

开启和监听 设备旋转的通知(不开启的话,设备方向一直是UIInterfaceOrientationUnknown)if (![UIDevice currentDevice].generatesDeviceOrientationNotifications) {[[UIDevice currentDevice] beginGeneratingDeviceOrientationNotifications];}[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(handleDeviceOrientationChange:) name:UIDeviceOrientationDidChangeNotification object:nil];

当然肯定我们知道屏幕的方向,就可以设置屏幕的旋转了,我们也可以通过手动设置来改变屏幕的方向, (setOrientation:已经被设置为私有方法,上架会被拒,但是kvc的强大可以解决)

- (void)buttonFullOnClick:(BOOL)isFull{if (isFull) {[self enterToLandscape];[[UIDevice currentDevice] setValue:[NSNumber numberWithInteger:UIDeviceOrientationLandscapeLeft] forKey:@"orientation"];}else{[self backToPortrait];[[UIDevice currentDevice] setValue:[NSNumber numberWithInteger:UIDeviceOrientationPortrait] forKey:@"orientation"];}
}

最后关键的地方来了,也是我自己犯错的地方,这个是我写返回按钮点击事件写的方法,这个方法导致了我返回的时候出现横屏的问题,所以我重点说明一下

- (void)backBtnOnClick{WeakSelf[LYTool showAlterViewWithTitle:nil message:@"确认退出观看?" completeBlock:^(NSInteger index) {if (index == 1) {if (_isHalfScreen == NO) {[weakSelf buttonFullOnClick:NO];}weakSelf.navigationController.navigationBarHidden = YES;[weakSelf.navigationController popViewControllerAnimated:YES];}}];
}2、点击切换为小屏时
- (void)smallScreen{_isHalfScreen  = YES;[UIView animateWithDuration:0.01 animations:^{_player.view.frame=CGRectMake(0, 0, SCREEN_WIDTH, SCREEN_HEIGHT);} completion:^(BOOL finished) {
//        [self.navigationController popViewControllerAnimated:YES];}];
//    [self setNeedsStatusBarAppearanceUpdate];
}设备方向改变的处理- (void)handleDeviceOrientationChange:(NSNotification *)notification{UIDeviceOrientation deviceOrientation = [UIDevice currentDevice].orientation;switch (deviceOrientation) {case UIDeviceOrientationLandscapeLeft:NSLog(@"屏幕向左横置");[self fullScreen];break;case UIDeviceOrientationLandscapeRight:NSLog(@"屏幕向右橫置");[self fullScreen];break;case UIDeviceOrientationPortrait:NSLog(@"屏幕直立");[self smallScreen];break;case UIDeviceOrientationPortraitUpsideDown:NSLog(@"屏幕直立,上下顛倒");
//            [self smallScreen];break;default:NSLog(@"无法辨识");break;}}

上面的 2、点击切换为小屏时 其实就是屏幕的旋转成横屏的时候会调用的方法 ,也就是屏幕方向改变的时候,会调用的方法,从而调用方法2。重点就是这一句的位置。

[self.navigationController popViewControllerAnimated:YES];

我开始的时候是放在上面的位置,连续三次反复之后,就出现屏幕一直横屏的情况,是不是很坑,其实想一想也是这么回事,以为屏幕的旋转是有动画,是要时间的,但是这个方法调用却是很快,就会存在还没有旋转回来就出现已经返回上一个界面,然后界面就被释放了,理所当然就不会调用那个方法就不会有用,要在动画旋转结束的completion:(^)回调中执行上面的方法,这样就完美解决刚才的问题,之前把自己坑坏了呀

总结

就是自己给自己挖坑,然后自己慢慢花时间填坑,MMP一句终结本篇。

iOS的push方法推出控制器界面中单个屏幕的旋转问题相关推荐

  1. windows禁用屏幕旋转_如何在Windows 10中禁用屏幕自动旋转

    windows禁用屏幕旋转 Windows 10 can automatically rotate your display if you have a convertible PC or table ...

  2. iphone应用程序中禁止屏幕自动旋转 自定义屏幕旋转

    在summary中的 supported devices orientation中设置所支持的屏幕旋转方式在实际RUN时并不会应用所选项目,正确的禁止屏幕旋转方向以及自定义屏幕旋转方式要在viewco ...

  3. 如何在present出来的viewController里使用push方法

    2019独角兽企业重金招聘Python工程师标准>>> MenuViewController * menuViewController = [[MenuViewController ...

  4. javascript 之 push方法

    JavaScript中的push是Array对象中的一个方法.push方法可以为一个已存在的数组添加新的元素.比如说你的数组中已存在3个元素.有时候你必须动态的向该数组中再添加新的元素,来改变现有数组 ...

  5. push方法java_万字长文深入浅出谈Java数据类型系列之Stack

    一. Stack 初识 Java 集合框架提供了一个集合Stack,它提供了stack 数据结构的功能,Java 中也提供了其他很多这样的集合,这种集合完成了某种数据结构的功能 1. stack 数据 ...

  6. QT界面中实现视频帧显示的多种方法及应用

    QT界面中实现视频帧显示的多种方法及应用 (一) 引言 1.1 视频帧在QT界面中的应用场景 1.2 不同方法的性能和适用性分析 1.2.1 使用QLabel和QPixmap 1.2.2 使用QPai ...

  7. iOS中单个控制器横屏切换的研究

    在项目中遇到了一个问题,app中有两个控制器要求可以切换横屏,研究了半天,终于找到了解决办法. 在AppDelegate中写 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 1 ...

  8. JSP界面中如何用a标签带参数跳转到控制器?

    JSP界面中如何用a标签带参数跳转到控制器? JSP页面: <a href="/vehicle/detail" class="reserve" style ...

  9. ios 图像坐标系_Mac,iOS界面中的三维坐标系

    原文:http://www.tuicool.com/articles/3IbQri 一. 三维坐标系 据说有一次笛卡尔生病了,躺在床上休息,但是他的大脑却没有休息,一只在寻思着通过什么手段把几何图形和 ...

最新文章

  1. 【西安交大】2020年最新深度学习目标检测方法综述
  2. Cisco ××× 完全配置指南-连载-PIX和ASA连接的故障诊断与排除
  3. 前端开源项目周报0425
  4. java rmi反序列化漏洞 简介
  5. ASP.NET 4.0 的新特性(2 在WebForm中使用Routing)(翻译)
  6. 计算机信息系统安全保护条例最新,计算机信息系统安全保护条例.doc
  7. 四:理解Page类的运行机制(例:基于PageStatePersister的页面状态存取)
  8. PyQt5笔记(01) -- 创建空白窗体
  9. (217)如何选择硬件描述语言
  10. 《专家手记AJAX开发实战 》电子试读版发布
  11. c语言快速学习,怎么才能正确快速的学习c语言
  12. 手把手教你制作可以上线官方商店的微信动态表情包
  13. 微信小程序运营之如何获取流量
  14. input框隐藏和不可编辑
  15. zabbix基础·配置短信报警
  16. 2020 中国移动的流量套餐
  17. YUVPlayer: 基于Android平台的YUV视频原始数据播放器
  18. Android Qcom Display学习(五)
  19. 7 Hive数据仓库
  20. 利用Python提取视频中的字幕(文字识别)

热门文章

  1. 日常梳理-kafka/zookeeper使用
  2. 关于腾讯企业邮箱密保邮箱
  3. 2021年3月4日 星期四 冬月九九 霾
  4. 第八节课·字幕识别+前几课梳理
  5. QQ链接防拦截方法(非官方页面、停止访问该页面等)
  6. 生日祝福小程序_热点丨小团团生日会享受史诗级牌面:DY官博更改头像送祝福!万达、西湖地贴屏显画面满满!...
  7. Oracle dba_tablespace_usage_metrics 视图 查看表空间 说明
  8. 基于云ModelArts的PPO算法玩“超级马里奥兄弟”【至简致远】
  9. 小米mix2安兔兔html5跑分,小米2s跑分:小米mix2s安兔兔跑分结果怎么样
  10. 支点软件测试工资,微软的软件测试之道(10)