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

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

你可能感兴趣的:(iOS横竖屏切换)