美文网首页
iOS横竖屏切换

iOS横竖屏切换

作者: 搬砖人666 | 来源:发表于2020-01-17 18:33 被阅读0次

    心塞

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

    大部分的应用场景:

    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;
    }
    

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

    相关文章

      网友评论

          本文标题:iOS横竖屏切换

          本文链接:https://www.haomeiwen.com/subject/fechzctx.html