Bil*_*ill 39 iphone objective-c uinavigationcontroller ios ios7
在我的iOS应用程序中,我的窗口的rootViewController是一个标签栏控制器,其层次结构如下:
当用户点击某一行时FirstContentController,一个实例SecondController将被推送到其导航控制器上.SecondContentController将hidesBottomBarWhenPushed要YES在其init方法和套self.navigationController.toolbarHidden来NO的viewWillAppear:.
在iOS 6中,用户将挖掘该行FirstController并SecondController会得到推到导航控制器.因为它已hidesBottomBarWhenPushed设置,它将隐藏标签栏,并且在转换动画完成时,SecondController它将在屏幕上显示其工具栏.
但是,在iOS 7下进行测试时,其hidesBottomBarWhenPushed行为似乎已发生变化.我现在看到的是:
差距完全无法使用 - 它不响应触摸,如果我clipsToBounds在主视图上设置为YES,则没有任何内容.经过大量的调试和检查子视图层次结构后,看起来iOS的自动调整机制将视图控制器的视图调整为高度411(在iPhone 5上).应该是460到达工具栏,但布局系统似乎包括一个"鬼"49像素高的标签栏.
如果视图控制器的标签栏控制器为其父容器,则只会出现此问题.
在iOS 7上,当按下新控制器时,如何使标签栏消失并且工具栏无缝滑动到位,并且视图还占用导航项和工具栏之间的整个空间?
UPDATE
经过进一步调查后,只有在SecondController edgesForExtendedLayout设置为时才会发生这种情况UIRectEdgeNone.但是,除非我将该属性设置为,否则UIRectEdgeNone视图的框架太长并且在工具栏下方延伸,在该工具栏中无法看到或与之交互.
sri*_*rik 19
我发现在viewDidLoadSecondViewController 中添加以下2行代码(你想要隐藏TabBar但显示工具栏)可以解决问题.
self.extendedLayoutIncludesOpaqueBars = YES;
self.edgesForExtendedLayout = UIRectEdgeBottom;
Run Code Online (Sandbox Code Playgroud)
我的SecondDController的viewDidLoad如下:
- (void)viewDidLoad {
[super viewDidLoad];
// These 2 lines made the difference
self.extendedLayoutIncludesOpaqueBars = YES;
self.edgesForExtendedLayout = UIRectEdgeBottom;
// The usual configuration
self.navigationController.navigationBar.barStyle = UIBarStyleBlack;
self.navigationController.navigationBar.translucent = NO;
self.navigationController.toolbarHidden = NO;
self.navigationController.toolbar.barStyle = UIBarStyleBlack;
self.navigationController.toolbar.translucent = NO;
.
.
}
Run Code Online (Sandbox Code Playgroud)
但是您需要手动修复视图的框架,因为这会导致大小为(320x504).这意味着它甚至延伸到工具栏后面.如果您不关心这个问题,那么此解决方案应该可行.
Leo*_*ica 17
你不会喜欢这个答案这不是你想要的答案,但经过一些关于在iOS7中隐藏标签栏的研究,我的结论是:不要!
标签栏从来没有被隐藏 - 毕竟为什么有一个UITabBarController如果你想隐藏标签栏.的hidesBottomBarWhenPushed上视图控制器是用于隐藏导航控制器,而不是标签栏的底部栏.从文档:
添加为导航控制器子级的视图控制器可以在屏幕底部显示可选工具栏.最顶层视图控制器上此属性的值确定工具栏是否可见.如果此属性的值为YES,则隐藏工具栏.如果此属性的值为NO,则条形图可见.
此外,系统会警告您不要直接修改选项卡栏对象.再次,从文档:
您永远不应该尝试操纵存储在此属性中的UITabBar对象.
这正是您将其设置为隐藏时所执行的操作.
在iOS6中,这已经奏效,但现在在iOS7中,它没有.并且它似乎很容易隐藏它.当你最终设法隐藏它时,如果应用程序进入后台并返回,Apple的布局逻辑将覆盖您的更改.
我的建议是以模态方式显示您的数据.在iOS7中,您可以创建自定义过渡,因此如果您有推送过渡很重要,您可以自己重新创建它,尽管这有点过头了.普通的模态转换是用户熟悉的,实际上比隐藏标签栏的推送更适合这种情况.
另一种解决方案是使用工具栏而不是标签栏.如果您使用选项卡的导航控制器工具栏,则可以hidesBottomBarWhenPushed根据需要使用它,它会为您提供所期望的行为.
取消选中"在推送时隐藏底部栏"并设置自动约束,就像有一个标签栏一样.然后在控制器的"ViewDidLoad"中隐藏系统标签栏,输入以下代码.
[self.tabBarController.tabBar setFrame:CGRectZero];
Run Code Online (Sandbox Code Playgroud)
这样可以确保标签栏仍然接受用户交互但用户不可见.(其他替代方法,例如将其设置为0 alpha或隐藏将使标签栏无效)现在,autoconstaraints将确保您的视图正确显示,标签栏高度为零.
由于以下特定组合,这是iOS 7 UIKit中的错误:
您应该向Apple提交错误,并提供示例代码。
要变通解决此错误,您需要删除这四个条件之一。两种可能的选择:
修复“第二个”视图控制器的布局,使其在edgesForExtendedLayout设置为时可以正常工作UIRectEdgeAll。这可以像contentInset在滚动视图上设置一样简单。
不要使用UINavigationController的内置工具栏。而是创建一个单独的UIToolBar实例,然后将其手动添加到第二个视图控制器的视图中。
| 归档时间: |
|
| 查看次数: |
19368 次 |
| 最近记录: |