在我的iOS应用程序中,我的窗口的rootViewController是一个选项卡栏控制器,其层次 struct 如下:

  • UITabBarController
    • UINavigationController 1
    • UINavigationController 2
    • UINavigationController 3
    • ...

当用户点击FirstContentController上的某一行时,SecondController的一个实例将被推到其导航控制器上.SecondContentController在其init方法中设置hidesBottomBarWhenPushedYES,在viewWillAppear:中设置self.navigationController.toolbarHiddenNO.

在iOS 6中,用户将点击FirstController中的行,SecondController将被推到导航控制器上.因为它设置了hidesBottomBarWhenPushed,所以它会隐藏选项卡栏,当过渡动画完成时,SecondController将出现在屏幕上,工具栏可见.

然而,在iOS 7下进行测试时,hidesBottomBarWhenPushed的行为似乎发生了变化.我现在看到的是:

  • 选项卡栏会按预期隐藏
  • 工具栏将按预期显示
  • 工具栏和内容视图之间会出现一个49像素高(选项卡栏的高度)的不可用空间间隙

这个间隙完全无法使用——它对touch 没有react ,如果我在主视图中将clipsToBounds设置为"是",则没有任何效果.经过大量调试和判断子视图层次 struct 后,iOS的自动调整大小机制似乎将视图控制器的视图调整到了411的高度(在iPhone 5上).它应该是460才能一直延伸到工具栏,但布局系统似乎包括一个49像素高的"幽灵"选项卡栏.

只有当视图控制器的父容器中有一个选项卡栏控制器时,才会出现此问题.

在iOS 7上,当按下新控制器时,如何让选项卡栏消失,工具栏无缝滑动到位,并且视图仍占据导航项和工具栏之间的整个空间?

UPDATE

经过进一步调查,只有当SecondController的edgesForExtendedLayout设置为UIRectEdgeNone时,才会发生这种情况.但是,除非我将该属性设置为UIRectEdgeNone,否则视图的框架太长,并延伸到工具栏下方,在那里无法看到或与之交互.

推荐答案

取消选中"在推送时隐藏底部栏",并将自动约束设置为有一个选项卡栏.然后在要隐藏系统选项卡栏的控制器的"ViewDidLoad"中,输入以下代码.

[self.tabBarController.tabBar setFrame:CGRectZero];

这确保选项卡栏仍然接受用户交互,但用户不可见.(其他选项,如将其设置为0 alpha或hidden,将使选项卡栏无效)现在,autoconstaraints将确保视图正确显示,选项卡栏高度为零.

Objective-c相关问答推荐

NSMutableDictionary 的深层可变副本

Objective C 中的多个委托

iOS 心率检测算法

将长按手势和拖动手势结合在一起

是否可以在 nsstring 中包含引号?

iOS:将 URL 解析为段

Objective C - 为什么常量以 k 开头

使用正则表达式在 Xcode 中查找/替换

UITableView configureCellForDisplay:forIndexPath 中的断言失败:

WKWebView 判断 JavaScript 返回值

Objective-C 中的 super 到底是什么?

'supportedInterfaceOrientations' 实现中的返回类型冲突: - 警告

如何将小时数添加到 NSDate?

获取包含在 NSString 中的文件的扩展名

UILabel 根据要显示的文本自动调整大小

使用 cocoaLumberjack 将日志(log)文件存储在哪里

重复符号问题

Block 隐式保留'self';明确提及touch以表明这是预期行为

CMTime 秒输出

Unwind Segue 在 iOS 8 中不起作用