自动布局和“按下时隐藏底部栏”

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

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

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

在故事板中,我将一个普通的UIView子类添加到VC,看起来像一个底部栏,我使用自动布局将其固定到VC视图的底部。

问题
当我推VC时,这个视图需要一秒钟的时间来固定到底部,它看起来像自动布局钉在底部好像标签栏没有隐藏,并在一秒后,它认识到标签栏是隐藏的,并移动它到真实的底部。

我知道这不是最好的解释,所以我添加了一个非常简单的项目来演示这个问题。

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

在这里输入图像说明

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

在这里输入图像说明

在这里你需要select底部

在这里输入图像说明

一旦你有了这个,粉红色的视图不再受布局指南的影响。 布局指南似乎承认,只有在推送的视图控制器的根视图在主屏幕的边界之后,标签栏才被隐藏,并且这仅在animation完成时才发生。

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

接受的答案不适合我(选项不可用)。 但是我find了另一个解决scheme。 (根据通过Autolayout推出时隐藏底部栏 )

select展位的视图和对象(在我的情况下btnShare),并添加一个新的alignment约束(底部边缘)。

在这里输入图像说明 在这里输入图像说明

嗨在故事板中select选项卡栏(是选项卡栏控制器场景>选项卡栏控制器>选项卡栏),在属性检查器中取消选中半透明框。 这个动作解决了你的问题。 (但有很多东西,“推下时隐藏底部栏”是工具栏)。

如果你不能在你的Xcode 7+中selectbottomlayoutguide底部

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

在编辑器中打开 search你的控制器的标识符

在源文件中搜索 find<layoutGuides> ,键入<bottom> ,复制它的id

找到layoutGuides 通过从上到下的ID变化属性进行search

查找和替换 请享用。

select您的“导航控制器”,然后在“属性检查器”中删除“底部酒吧”下的选中标记。

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

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

您还必须将该代码(但传递NO)放到您希望标签栏可见的控制器中。 您也应该取消selectIB中的“隐藏底部栏”。

编辑后:

如果在第一个控制器中,在非常短的时间内将非隐藏标签栏的Alpha值从0变为1,则会获得更好的animation效果。 这看起来不错,如果你回去的后退button。 如果要使用滑动回退,则必须执行一些涉及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; }]; } 

在故事板中,转到要隐藏标签栏的视图控制器,单击属性检查器,然后select隐藏底部栏 。 检查图像波纹pipe。

故事板的例子

 -(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; }]; } 

设置UINavigationBar半透明的NO。

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

尝试将视图的底部固定到超级视图的底部,而不是底部布局