竖屏iOS应用中强制部分页面横屏的方法

需求

今天在使用B站的ijkmedia做视屏播放的功能,视频播放的那个页面我想强制让他横屏。当前的应用本来是一个竖屏应用。查了各种网站方法很多种,但是很多都有各种问题,不符合当前的场景。最终找到了一个解决办法。

处理方法

1 UINavagationController

由于当前的屏幕状态是通过UINavagationController来控制的,所以我们首先需要自定义一个UINavagationController:

@implementation XddBaseNavagationVC

- (BOOL)shouldAutorotate
{
 return [self.viewControllers.lastObject shouldAutorotate];
}

- (UIInterfaceOrientationMask)supportedInterfaceOrientations
{
 return [self.viewControllers.lastObject supportedInterfaceOrientations];
}

@end

这么做是为了当从横屏页面返回之后,能够让页面保持竖屏(其实是去获取返回之后VC的屏幕状态)。

2 UITabBarViewController

因为当前的应用是一个tabbar应用,所以我们也需要保证tabbar能够正常的显示。我使用了一个分类来处理这个问题,tabbarvc的状态依赖当前选中的VC的属性:

@implementation LCTabBarController (Autorotate)

- (BOOL)shouldAutorotate
{
 return [self.selectedViewController shouldAutorotate];
}

- (UIInterfaceOrientationMask)supportedInterfaceOrientations
{
 return [self.selectedViewController supportedInterfaceOrientations];
}

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

@end

3 BaseVC

然后在我的整个应用中,BaseVC是所有的VC的基类,通过这个我统一的处理了一些问题,因为当前的应用是竖屏的,所以在BaseVC中实现如下几个函数,保证VC竖屏显示:

// 只支持竖屏
- (BOOL)shouldAutorotate {
 return NO;
}

- (UIInterfaceOrientationMask)supportedInterfaceOrientations
{
 return UIInterfaceOrientationMaskPortrait;
}

-(UIInterfaceOrientation)preferredInterfaceOrientationForPresentation
{
 return UIInterfaceOrientationPortrait;
}

4 横屏VC的处理

我的横屏的VC也是继承了BaseVC,如果不处理,也会竖屏。通过以下代码进行特殊处理,覆盖BaseVC中的几个方法:

- (BOOL)shouldAutorotate {
 return YES;
}

- (UIInterfaceOrientationMask) supportedInterfaceOrientations {
 return UIInterfaceOrientationMaskLandscapeRight;
}

- (UIInterfaceOrientation)preferredInterfaceOrientationForPresentation {
 return UIInterfaceOrientationLandscapeRight;
}

这样就能让他正确的横屏显示,并且返回回去仍然是竖屏。

注意点

当在弹出横屏的VC的时候一定要注意以下几点:

  1. 当前的方式只支持模态弹出。push是会出问题的。
    2.弹出方法,必须要用XddBaseNavagationVC进行包装才可以使用,否则会导致返回之后竖屏的页面变成横屏。
 UINavigationController *nav = [[XddBaseNavagationVC alloc]initWithRootViewController:[[IJKVideoViewController alloc] initWithURL:url]];
 
    [viewController presentViewController:nav animated:YES completion:completion];
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 发现 关注 消息 iOS 第三方库、插件、知名博客总结 作者大灰狼的小绵羊哥哥关注 2017.06.26 09:4...
    肇东周阅读 12,192评论 4 61
  • 经历了漫长冬天的等待,终于等到你——春。 像朱自清先生散文里写到:盼望着,盼望着,东风来了,春天的脚...
    大朵朵很聪明阅读 546评论 0 7
  • 花开亦有痕
    崔荣梅阅读 157评论 0 1
  • 第一部分 克服天性中的选择弱势 选择太多怎么办? 1.1.1管理学和心理学大师詹姆斯·马奇认为,我们一般人在做抉择...
    杨秀兵阅读 161评论 0 0
  • 童年,有条母亲的河,水意柔软,娇韵得体,小鱼儿活络其中,母亲在拿她的身体为孩子提供氧气, 我是你身体的一半一半,你...
    二人余安阅读 241评论 0 3