iOS横竖屏切换

心塞

如此简单的问题百度谷歌搜个遍,互抄的文章太多就算了,还没有能解决问题的,只好自己解决了。

大部分的应用场景:

App默认仅支持竖屏,某些页面支持横屏,这些页面可能在NavigationController上,也可能在tabbarController上再嵌套NavigationController等等,不废话,直接上demo:https://github.com/360fengdai/ScreenRotate

横竖屏切换主要的两个问题

1、web播放器

App固定仅支持竖屏时,web播放视频时也无法切换横屏播放,导致体验非常差。
web播放器播放视频时,会弹出独立的window,页面层次如下:



解决web播放视频的横竖屏自动切换的思路:

- (BOOL)shouldAutorotate { }
- (UIInterfaceOrientationMask)supportedInterfaceOrientations { }

这俩核心方法中,判断是否为webview播放器弹出的页面,返回不同的结果。
代码如下:

类别Class UIViewController+ScreenRotate

- (BOOL)isWebViewPlayVideoInViewController:(UIViewController *)viewConroller {
    NSString *className = NSStringFromClass([viewConroller class]);
    // 适配web播放器
    if ([className isEqualToString:@"AVFullScreenViewController"]) {
        return YES;
    }else if([className isEqualToString:@"UIViewController"]) {
        // 适配web播放器
        if (viewConroller.presentedViewController) {
            UIViewController *controller = viewConroller.presentedViewController;
            if ([NSStringFromClass([controller class]) isEqualToString:@"AVFullScreenViewController"]) {
                return YES;
            }
        }
    }
    return NO;
}
- (UIInterfaceOrientationMask)supportedInterfaceOrientations{
    if ([self isWebViewPlayVideoInViewController:self]) {
        return UIInterfaceOrientationMaskAll;
    }
    return UIInterfaceOrientationMaskPortrait;
}
- (BOOL)shouldAutorotate{
    if ([self isWebViewPlayVideoInViewController:self]) {
        return YES;
    }
    return NO;
}
2、单个页面的横竖屏支持

解决思路:
把当前页面这两个方法的返回值覆盖到上层的tabbarViewController、navigationController。
贴一个 supportedInterfaceOrientations方法的代码, shouldAutorotate类似,详见上边demo链接。

- (UIInterfaceOrientationMask)orientationMaskWithNavigationController:(UINavigationController *)navigationViewController {
    UIViewController *topViewController = navigationViewController.topViewController;
    return [topViewController supportedInterfaceOrientations];
}

- (UIInterfaceOrientationMask)supportedInterfaceOrientations{
    // 适配web播放器支持屏幕方向
    if ([self isWebViewPlayVideoInViewController:self]) {
        return UIInterfaceOrientationMaskAll;//web播放器支持的屏幕方向
    } else if ([self isKindOfClass:[UINavigationController class]]) {
        // 适配单页面支持屏幕方向
        UINavigationController *navigationController = (UINavigationController *)self;
        return [self orientationMaskWithNavigationController:navigationController];
    }else if ([self isKindOfClass:[UITabBarController class]]) {
        // 适配单页面支持屏幕方向
        UITabBarController *tabbarController = (UITabBarController *)self;
        UIViewController *viewController = [tabbarController selectedViewController];
        if ([viewController isKindOfClass:[UINavigationController class]]) {
            UINavigationController *navigationController = (UINavigationController *)viewController;
            return [self orientationMaskWithNavigationController:navigationController];
        }else if ([viewController isKindOfClass:[UIViewController class]]) {
            return [viewController supportedInterfaceOrientations];
        }
    }
    // 默认仅支持竖屏
    return UIInterfaceOrientationMaskPortrait;
}

如有横竖屏切换的其他问题,可评论或者私信交流。

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • iOS 中横竖屏切换的功能,在开发iOS app中总能遇到。以前看过几次,感觉简单,但是没有敲过代码实现,最近又碰...
    零度_不结冰阅读 6,648评论 0 0
  • iOS 横竖屏切换解决方案 前言 在大多数项目中,App 的 UI 方向都是竖屏的,所以一般会在 target 中...
    yizhaorong阅读 15,472评论 3 68
  • 背景: 项目作为SDK接入到游戏项目中,切游戏是横屏,SDK只支持竖屏,在xCode11上编译包会出现一个瞬间的抖...
    我只是个仙阅读 9,738评论 3 6
  • 网上关于横竖屏切换的资料很多,但是很容易踩到坑,不是屏幕不旋转,就是屏幕旋转后没有状态栏等,在写的小demo里屏幕...
    凌云01阅读 3,590评论 0 0
  • 在网上找iOS横屏相关的信息时发现只有进入页面强制横屏的代码,并没有在一个页面通过点击按钮的方式实现当前屏幕的横竖...
    iOS_Edward阅读 5,688评论 4 1

友情链接更多精彩内容