TabBarController 的自动布局问题

Posted

技术标签:

【中文标题】TabBarController 的自动布局问题【英文标题】:AutoLayout issue with TabBarController 【发布时间】:2017-05-07 19:51:18 【问题描述】:

我遇到了一个非常尴尬的自动布局问题。我有一个导航控制器,出于某种目的,我已将其 rootviewcontroller 设置为 tabbarview 控制器。见下图:

在上图中你可以看到有 6 个 viewcontroller 与 tabbarviewcontroller 相连。

在第 3、4、5 和 6 个视图控制器中添加了一个白色视图和自动布局,如下所示:

现在,当我选择选项卡 3 或 4 运行后,添加的视图完全按照我的意愿显示,并且根据自动布局,它应该显示为显示的样子。即下面给出:

现在,当我选择“更多”时,它会根据其默认行为显示一个 tableviewcontroller,如下所示:

这是发生的问题,现在如果您从列表中选择任何项目并转到受尊重的视图控制器,添加的白色视图会从导航栏中下降。我不明白为什么会这样。请看图片:

我一整天都在尝试解决这个问题,但没有任何反应,有些方法得到了一个解决方案,但这不是我需要的。即见下图:

如果取消选中该视图控制器的“在顶部栏下”,则它可以正常工作,但它会影响导航栏,这是我不想要的。请看图片:

这里有人遇到过类似问题并找到了完美的解决方案,我正在寻求帮助。

注意:任何视图控制器中都没有类,都在故事板中。

提前致谢。

【问题讨论】:

禁用 viewController 的 Adjust Scroll View Insets @KKRocks 这样做了,但没有用。 UINavigationBar.appearance().translucent = false in appdelegate 试试这个 它确实有效,但在导航栏下方带有一个后退按钮。这不是我要找的。 @KKRocks 你能把这个截图发过来吗? 【参考方案1】:

这是有两个导航栏的问题......你可以跟踪视图层次......你能解释一下你想要什么吗?

【讨论】:

是的,我需要一个带有 rootviewcontroller tabbarcontroller 的导航栏,现在如果在该 tabbarcontroller 中添加 5 个视图控制器并通过故事板添加视图的子视图,它适用于所有 5 个视图控制器,但是当我再添加一个视图控制器时,第 5 个视图控制器和第 6 个视图控制器在一个表视图下,这很好,但是当我从表视图中选择任何视图控制器时,添加子视图就会下降。可能它正在发生你的答案,而且我很确定它是由于两个导航控制器,但现在要骑它..? 在情节提要中检查您的视图控制器....尝试删除该导航控制器。 但我必须为我的实际项目保留它。 什么是真正的项目...你只需要删除这个控制器。 选择该导航栏并按删除键或***.com/a/17549703/3901620【参考方案2】:

为我的 tabbarcontroller 获取了一个 UiTbaBarControllerClass,在该控制器中我设置了委托自我并遵循我的代码,现在它可以按我的意愿工作。非常感谢@KKRocks

代码:

 #import "TabBarController.h"

    @interface TabBarController ()<UITabBarControllerDelegate>

    @end

    @implementation TabBarController

    - (void)viewDidLoad 
        [super viewDidLoad];
        // Do any additional setup after loading the view.

        self.delegate = self;
    

#pragma mark UITabBarController Delegate

    - (void)tabBarController:(UITabBarController *)tabBarController
     didSelectViewController:(UIViewController *)viewController
    
        NSLog(@"controller class: %@", NSStringFromClass([viewController class]));
        NSLog(@"controller title: %@", viewController.title);

        if ([viewController.title isEqual:@"More"]) 

           [self.navigationController setNavigationBarHidden: YES animated: NO];
        
    

Swift 中:

class TabBarController: UITabBarController, UITabBarControllerDelegate 

    override func viewDidLoad() 
        super.viewDidLoad()
        // Do any additional setup after loading the view.
        self.delegate = self
    

// MARK: UITabBarController Delegate

    func tabBarController(_ tabBarController: UITabBarController, didSelectViewController viewController: UIViewController) 

        print("controller class: \(String(describing: viewController.self))")

        print("controller title: \(String(describing: viewController.title))")

        if viewController.title?.isEqual("More") 

            navigationController?.setNavigationBarHidden(true, animated: false)
        
    

现在它工作得很好。 :)

【讨论】:

以上是关于TabBarController 的自动布局问题的主要内容,如果未能解决你的问题,请参考以下文章

pushViewController 使用 hidesBottomBarWhenPushed (iphone6) 导致自动布局问题

TabBarController 添加自定义按钮不可点击问题[重复]

从选项卡控制器中删除选项卡时的自动布局问题

从自定义 UIViewController 导航到 TabBarController 而不使用 segue

在 TabBArController 中自定义 tabBarItems 的外观

iOS 自定义TabBarController zhuanzai