Code Bye

在工程设置app只支持竖屏,问题来了

 

再在工程设置app只支持竖屏,问题来了,但是发现现在某个页面需要支持横屏,该如何解决呢?

下面方法好像无效

http://zhidao.baidu.com/link?url=3Vr-KHawAvl–hx1MFkRqxm_BzDnqgpfKoEyZVUcv2-WlD-89ONPCLR-KSTU1yx6Ux-tvashEzGOlE8meQdfqNuigJdOqcRVdie-n2yMRg7


100分
我给你回详细一点吧。
假设目前工程结构是这样的:有一个TabBarController,TabBarController中的每一个Tab都是一个NavigationController,而NavigationController进入到第三级的时候是一个DetailVC(假设是一个需要支持视频播放的Controller),只有DetailVC要支持横、竖屏,它的父VC们都不能支持横屏,这种情况下,如果你有一个所有VC的基类的话,需要添加:
- (BOOL)shouldAutorotate {
    return YES;
}

- (NSUInteger)supportedInterfaceOrientations {
    return UIInterfaceOrientationMaskPortrait;
}

只支持竖屏,这是作为所有VC的默认实现。

在TabBarController里添加:

- (BOOL)shouldAutorotate {
    UINavigationController *navController = (UINavigationController *)self.contentViewController;
    if ([navController isKindOfClass:[UITabBarController class]]) {
        navController = (UINavigationController *)((UITabBarController *)navController).selectedViewController;
    }
    return [navController shouldAutorotate];
}

- (NSUInteger)supportedInterfaceOrientations {
    UINavigationController *navController = (UINavigationController *)self.contentViewController;
    if ([navController isKindOfClass:[UITabBarController class]]) {
        navController = (UINavigationController *)((UITabBarController *)navController).selectedViewController;
    }
    return [navController supportedInterfaceOrientations];
}

TabBarController不知道哪个子VC要横屏,所以只能“问”它们,如果TabBarController不支持横屏的话,它的子VC也支持不了。

进入NavigationController(你可以用类别),添加:

- (BOOL)shouldAutorotate {
    return [[self.viewControllers lastObject] shouldAutorotate];
}

- (NSUInteger)supportedInterfaceOrientations {
    return [[self.viewControllers lastObject] supportedInterfaceOrientations];
}

- (UIInterfaceOrientation)preferredInterfaceOrientationForPresentation {
    return [[self.viewControllers lastObject] preferredInterfaceOrientationForPresentation];
}

同上,NavigationController也不知道哪个子VC要横屏,也只能问。

进入DetailVC:

- (IBAction)toggleLandscape {
    if (self.view.width < self.view.height) {
        [[UIDevice currentDevice] setValue:[NSNumber numberWithInteger:UIInterfaceOrientationLandscapeRight] forKey:@"orientation"];
    } else {
        [[UIDevice currentDevice] setValue:[NSNumber numberWithInteger:UIInterfaceOrientationPortrait] forKey:@"orientation"];
    }
}

- (NSUInteger)supportedInterfaceOrientations {
    return UIInterfaceOrientationMaskPortrait | UIInterfaceOrientationMaskLandscapeRight;
}

- (BOOL)shouldAutorotate {
    return YES;
}

横竖屏都要支持,并且能够通过toggleLandscape在横竖屏下切换,这种方法在强制竖屏的时候(触发toggleLandscape)仍然有效。

我有时间的话可以出个demo
引用 1 楼 zhangao0086 的回复:

我给你回详细一点吧。
假设目前工程结构是这样的:有一个TabBarController,TabBarController中的每一个Tab都是一个NavigationController,而NavigationController进入到第三级的时候是一个DetailVC(假设是一个需要支持视频播放的Controller),只有DetailVC要支持横、竖屏,它的父VC们都不能支持横屏,这种情况下,如果你有一个所有VC的基类的话,需要添加:

- (BOOL)shouldAutorotate {
    return YES;
}

- (NSUInteger)supportedInterfaceOrientations {
    return UIInterfaceOrientationMaskPortrait;
}

只支持竖屏,这是作为所有VC的默认实现。

在TabBarController里添加:

- (BOOL)shouldAutorotate {
    UINavigationController *navController = (UINavigationController *)self.contentViewController;
    if ([navController isKindOfClass:[UITabBarController class]]) {
        navController = (UINavigationController *)((UITabBarController *)navController).selectedViewController;
    }
    return [navController shouldAutorotate];
}

- (NSUInteger)supportedInterfaceOrientations {
    UINavigationController *navController = (UINavigationController *)self.contentViewController;
    if ([navController isKindOfClass:[UITabBarController class]]) {
        navController = (UINavigationController *)((UITabBarController *)navController).selectedViewController;
    }
    return [navController supportedInterfaceOrientations];
}

TabBarController不知道哪个子VC要横屏,所以只能“问”它们,如果TabBarController不支持横屏的话,它的子VC也支持不了。

进入NavigationController(你可以用类别),添加:

- (BOOL)shouldAutorotate {
    return [[self.viewControllers lastObject] shouldAutorotate];
}

- (NSUInteger)supportedInterfaceOrientations {
    return [[self.viewControllers lastObject] supportedInterfaceOrientations];
}

- (UIInterfaceOrientation)preferredInterfaceOrientationForPresentation {
    return [[self.viewControllers lastObject] preferredInterfaceOrientationForPresentation];
}

同上,NavigationController也不知道哪个子VC要横屏,也只能问。

进入DetailVC:

- (IBAction)toggleLandscape {
    if (self.view.width < self.view.height) {
        [[UIDevice currentDevice] setValue:[NSNumber numberWithInteger:UIInterfaceOrientationLandscapeRight] forKey:@"orientation"];
    } else {
        [[UIDevice currentDevice] setValue:[NSNumber numberWithInteger:UIInterfaceOrientationPortrait] forKey:@"orientation"];
    }
}

- (NSUInteger)supportedInterfaceOrientations {
    return UIInterfaceOrientationMaskPortrait | UIInterfaceOrientationMaskLandscapeRight;
}

- (BOOL)shouldAutorotate {
    return YES;
}

横竖屏都要支持,并且能够通过toggleLandscape在横竖屏下切换,这种方法在强制竖屏的时候(触发toggleLandscape)仍然有效。

还有一个问题就是,说一开始在要某个基类中限制只支持竖屏,这和我在 工程的Deployment info 中将device orientation中的landscape  去掉,道理是一样的吗

不一样,工程的device orientation是方向的总开关,如果没有landscape,是不支持真正的横屏的
学习了学习了

CodeBye 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明在工程设置app只支持竖屏,问题来了