自动布局和“按下时隐藏底部栏”
我的应用程序(简化)的结构是这样的:
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
通过从上到下的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;
尝试将视图的底部固定到超级视图的底部,而不是底部布局