再在工程设置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
|
|
还有一个问题就是,说一开始在要某个基类中限制只支持竖屏,这和我在 工程的Deployment info 中将device orientation中的landscape 去掉,道理是一样的吗 |
|
不一样,工程的device orientation是方向的总开关,如果没有landscape,是不支持真正的横屏的
|
|
学习了学习了
|