整个星期我一直在寻找解决我的独特问题的方法,但是对我来说什么都没有用。我有一个TabBarController有6个选项卡。 iOS自动创建“更多”选项卡,其中包含我遇到困难的视图控制器“仪表板”。 “仪表板”视图控制器充当页面控制器,有3页。
当我按下“仪表板”项时,我希望屏幕方向从纵向更改为横向。我通过无数其他SO帖子了解到旋转是从父TabBarController控制的。我还了解到“更多”选项卡实际上是一个导航控制器,它为混音添加了更多的复杂功能。
重申并直接说,当我按下TabBarController的“更多”标签中的“仪表板”标签时,我希望屏幕将其方向从纵向更改为横向。
是的,我已经尝试过这个:[[UIDevice currentDevice] setValue:[NSNumber numberWithInteger: UIInterfaceOrientationLandscapeLeft]forKey:@"orientation"];
但它没有用。
我还尝试覆盖TabBarController和MoreNavigationController中与旋转和方向以及子视图有关的所有函数。我将在下面发布我的TabBarController。任何帮助将不胜感激,谢谢。
TabBarViewController.h:
@interface TabBarViewController : UITabBarController<UINavigationControllerDelegate>{}
@end
TabBarViewController.m:
@implementation TabBarViewController
- (void)viewDidLoad
{
[super viewDidLoad];
self.moreNavigationController.delegate = self;
}
- (BOOL)shouldAutorotate
{
return YES;
}
- (NSUInteger)supportedInterfaceOrientations
{
if([self.selectedViewController isKindOfClass:[Dashboard class]])
{
return UIInterfaceOrientationMaskLandscape;
}
return UIInterfaceOrientationMaskAll;
}
- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation
{
return YES;
}
- (NSUInteger)tabBarControllerSupportedInterfaceOrientations:(UITabBarController *)tabBarController
{
if([tabBarController.selectedViewController isKindOfClass:[Dashboard class]])
{
return UIInterfaceOrientationMaskLandscape;
}
return UIInterfaceOrientationMaskAll;
}
- (void)tabBarController:(UITabBarController *)tabBarController didSelectViewController:(UIViewController *)viewController
{
NSLog(@"tabBarController didSelectViewController = %lu", (unsigned long)tabBarController.selectedIndex);
}
- (NSUInteger)navigationControllerSupportedInterfaceOrientations:(UINavigationController *)navigationController
{
if([navigationController.topViewController isKindOfClass:[Dashboard class]]
|| [navigationController.topViewController isKindOfClass:[ViewController1 class]]
|| [navigationController.topViewController isKindOfClass:[ViewController2 class]]
|| [navigationController.topViewController isKindOfClass:[ViewController3 class]])
{
return UIInterfaceOrientationMaskLandscape;
}
return UIInterfaceOrientationMaskAllButUpsideDown;
}
- (UIInterfaceOrientation)navigationControllerPreferredInterfaceOrientationForPresentation:(UINavigationController *)navigationController
{
NSLog(@"navigationControllerPreferredInterfaceOrientationForPresentation");
if([navigationController.topViewController isKindOfClass:[Dashboard class]]
|| [navigationController.topViewController isKindOfClass:[ViewController1 class]]
|| [navigationController.topViewController isKindOfClass:[ViewController2 class]]
|| [navigationController.topViewController isKindOfClass:[ViewController3 class]])
{
return UIInterfaceOrientationLandscapeLeft | UIInterfaceOrientationLandscapeRight;
}
return UIInterfaceOrientationPortrait|UIInterfaceOrientationMaskLandscapeRight|UIInterfaceOrientationMaskLandscapeLeft;
}
- (void)navigationController:(UINavigationController *)navigationController
willShowViewController:(UIViewController *)viewController
animated:(BOOL)animated
{
if([viewController isKindOfClass:[Dashboard class]])
{
[[UIDevice currentDevice] setValue:[NSNumber numberWithInteger: UIInterfaceOrientationLandscapeLeft]forKey:@"orientation"];
}
}
@end
答案 0 :(得分:0)
虽然有很多可能和尝试这个来解决这个问题,但主要问题在于每个UINavigationController
的精心设计,对supportedInterfaceOrientations
中的UITabBarController
,以及一些强制执行所需方向的代码。
很有可能,这可能只是一个iOS错误,因为一旦轮换,UINavBarController
和所有嵌入式UINavigationController
的行为都会正确。
以下声明不正确。标签栏控制器旋转。
TabBarControllers无法旋转
每个UINavigationController
景观示例:
class HorizontalNavigationController: UINavigationController {
override var supportedInterfaceOrientations : UIInterfaceOrientationMask {
return .landscape
}
}
肖像示例:
class VerticalNavigationController: UINavigationController {
override var supportedInterfaceOrientations : UIInterfaceOrientationMask {
return .portrait
}
}
将TabBarController
方向推迟到选定的视图控制器
class TabBarController: UITabBarController {
override var supportedInterfaceOrientations : UIInterfaceOrientationMask {
if let selectedViewController = selectedViewController {
return selectedViewController.supportedInterfaceOrientations
}
return .allButUpsideDown
}
}
强制界面更改
这是UITabBarController
的争议方面。不知何故,方向改变不会像UINavigationController
那样发生,需要轻推。
要使用最少量的代码执行此操作,请使用Object并将其子类化为TabBarControllerDelegate
。您可以在Interface Builder中执行most of the work。
class TabBarControllerDelegate: NSObject, UITabBarControllerDelegate {
func tabBarController(_ tabBarController: UITabBarController, didSelect viewController: UIViewController) {
let orientedViewController = UIViewController()
tabBarController.present(orientedViewController, animated: false) { () -> Void in
tabBarController.dismiss(animated: false, completion: { () -> Void in
})
}
}
}
故事板结构
使用Storyboard
有助于可视化应用程序的结构以及所有类之间的关系。
►在GitHub上找到此解决方案,并在Swift Recipes上找到其他详细信息。