心塞
如此簡單的問題百度谷歌搜個遍,互抄的文章太多就算了迎吵,還沒有能解決問題的躲撰,只好自己解決了。
大部分的應(yīng)用場景:
App默認僅支持豎屏击费,某些頁面支持橫屏拢蛋,這些頁面可能在NavigationController上,也可能在tabbarController上再嵌套NavigationController等等蔫巩,不廢話谆棱,直接上demo:https://github.com/360fengdai/ScreenRotate
橫豎屏切換主要的兩個問題
1、web播放器
App固定僅支持豎屏?xí)r圆仔,web播放視頻時也無法切換橫屏播放垃瞧,導(dǎo)致體驗非常差。
web播放器播放視頻時坪郭,會彈出獨立的window个从,頁面層次如下:
解決web播放視頻的橫豎屏自動切換的思路:
- (BOOL)shouldAutorotate { }
- (UIInterfaceOrientationMask)supportedInterfaceOrientations { }
這倆核心方法中,判斷是否為webview播放器彈出的頁面歪沃,返回不同的結(jié)果嗦锐。
代碼如下:
類別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;
}
如有橫豎屏切換的其他問題外驱,可評論或者私信交流育灸。