【问题标题】:Auto Layout and "Hide bottom bar when pushed"自动布局和“按下时隐藏底栏”
【发布时间】:2015-04-27 18:08:28
【问题描述】:

我的应用程序的(简化的)结构是这样的:

UITabBarController 一个UINavigationController 持有一个UITableViewController 作为根视图控制器。

当点击其中一个表格视图控制器单元格时,我推送一个常规的UIViewController(我们称之为 VC)结束隐藏底部标签栏。 (使用“按下时隐藏底栏”标志)

在故事板中,我向 VC 添加了一个常规的 UIView 子类,它看起来像一个底栏,我使用 Auto Layout 将其固定到 VC 视图的底部。

问题
当我按下 VC 时,这个视图需要一秒钟才能固定到底部,看起来像自动布局将它固定到底部,好像标签栏没有隐藏一样,一秒钟后它识别到标签栏被隐藏并移动它到视图的真正底部。

我知道这不是最好的解释,所以我添加了一个very simple project 来演示这个问题。

【问题讨论】:

  • 我认为您没有以预期的方式使用 hidesBottomBarWhenPushed 属性(查看文档中的该方法)。它应该是用于隐藏导航控制器可以呈现的工具栏,而不是标签栏。
  • 嗨@rdelmar 那么在推时隐藏标签栏的正确方法是什么?我相信这应该是一件很常见的事情。

标签: ios objective-c storyboard uitabbarcontroller autolayout


【解决方案1】:

嗨,在 storyboard 中选择 Tab bar (Is Tab Bar Controller Scene > Tab Bar Controller > Tab Bar ),在属性检查器中,取消选中 Translucent 框。此操作可解决您的问题。 (但有很多东西,“按下时隐藏底部栏”是工具栏)。

【讨论】:

  • 但是现在我推VC时标签栏是可见的,我需要隐藏它。
  • 至少,在您分享的示例项目(AutoLayoutTest)中,如果您只在标签栏中取消选中半透明属性,则标签栏会在您按下时消失,而紫色视图会出现在它的位置。 (测试你自己的项目)
  • 为我工作,但我正在寻找它可能导致的任何未来错误。
【解决方案2】:

如果你想隐藏标签栏,你可以将这段代码添加到你的控制器中,

- (void)viewWillAppear:(BOOL)animated {
    [super viewWillAppear:animated];
    self.tabBarController.tabBar.hidden = YES;
}

您还必须将该代码(但传递 NO)放入您希望标签栏可见的控制器中。您还应该取消选择 IB 中的“按下时隐藏底部栏”框。

编辑后:

如果在第一个控制器中将非隐藏标签栏的 alpha 值在短时间内从 0 设置为 1,您将获得更好的动画效果。如果您使用后退按钮返回,这看起来不错。如果您想使用向后滑动,则必须执行一些更复杂的操作,包括 interactivePopGestureRecognizer。

-(void)viewWillAppear:(BOOL)animated {
    [super viewWillAppear:animated];
    self.tabBarController.tabBar.hidden = NO;
    self.tabBarController.tabBar.alpha = 0.0;
    [UIView animateWithDuration:.4 animations:^{
        self.tabBarController.tabBar.alpha = 1.0;
    }];
}

【讨论】:

  • 此解决方案的问题是您看到标签栏的消失/出现。尤其是在使用向后滑动手势时。
  • @Eyal,我编辑了我的答案以展示改进动画的方法。
  • 我对这种解决方案不满意,我认为在 viewWillAppear/viewWillDisapear 上隐藏/显示标签栏有点冒险。似乎“隐藏底栏”在没有自动布局的情况下效果很好,所以我想知道是否与自动布局配置有关。
  • @Eyal,Onik IV 的解决方案有什么问题?当我取消选中标签栏的半透明属性时,我也看不到标签栏(并且仍然选中了隐藏的底部栏)。
【解决方案3】:

尝试将视图底部固定到父视图底部而不是底部布局

【讨论】:

    【解决方案4】:
    -(void)viewWillAppear:(BOOL)animated {
        [super viewWillAppear:animated];
        self.tabBarController.tabBar.hidden = NO;
        self.tabBarController.tabBar.alpha = 0.0;
        [UIView animateWithDuration:.3 animations:^{
            self.tabBarController.tabBar.alpha = 5.0;
        }];
    }
    

    【讨论】:

      【解决方案5】:

      用 NO 设置 UINavigationBar Translucent。

      像这样:self.navigationController.navigationBar.translucent = NO;

      【讨论】:

        【解决方案6】:

        选择您的“导航控制器”并在“属性检查器”中删除“底部栏下方”的复选标记。

        【讨论】:

          【解决方案7】:

          问题在于这个特定的约束,它位于视图和底部布局指南的顶部之间。

          选择约束并编辑其“第二项”属性

          这里需要选择底部

          一旦你有了它,粉红色的视图就不再受布局指南的影响。布局指南似乎承认只有在推送视图控制器的根视图位于主屏幕边界后才会隐藏选项卡栏,并且只有在动画完成时才会发生这种情况。

          这就是视图层次结构需要重新布局的原因,这会导致不需要的动画。

          【讨论】:

          • 当自动布局不起作用时stackoverflow.com/questions/29334285/…
          • @AnthonyM 我也遇到了这个问题。我最终手动编辑了故事板的源代码,以便我可以更改约束的项目以使用底部布局 guide.bottom。
          • @AnthonyM 它在 Xcode 7 中有点隐藏,但它就在那里:stackoverflow.com/a/33432500/125407
          • 只是想知道您如何设法手动编辑情节提要源代码,以便您可以更改约束的项目以使用底部布局 guide.bottom?我已经被这个问题困扰了一段时间,不明白为什么我不能再在故事板中选择底部?
          【解决方案8】:

          在情节提要中,转到要隐藏标签栏的视图控制器,单击属性检查器并选择按下时隐藏底栏。检查下面的图片。

          【讨论】:

          • 是的,这是正确的答案。在视图控制器上设置“按下时隐藏底部栏”,不应显示标签栏。不要在标签栏控制器、导航控制器或控制器的父视图控制器上设置它。
          【解决方案9】:

          接受的答案对我不起作用(该选项不可用)。但是我找到了另一种解决方案。 (基于Hide Bottom Bar When Pushed through Autolayout

          选择展位视图和要对齐的对象(在我的情况下为 btnShare)并添加新的对齐约束(底部边缘)。

          【讨论】:

          • 这对我不起作用,我在推送 ViewController 时仍然显示 1s 的空白。
          • 超级...非常有用
          【解决方案10】:

          如果您无法在 Xcode 7+ 中选择底部布局指南底部

          只需执行以下操作: 在源代码编辑器中打开故事板

          搜索控制器的标识符

          找到<layoutGuides>,输入<bottom>,复制它的id

          按身份证搜索 从上到下更改属性

          享受。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2012-08-16
            • 1970-01-01
            • 2012-02-17
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多