心塞
如此简单的问题百度谷歌搜个遍,互抄的文章太多就算了,还没有能解决问题的,只好自己解决了。
大部分的应用场景:
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;
}
如有横竖屏切换的其他问题,可评论或者私信交流。