【问题标题】:How to hide iOS tabbar and fill the space it leaves如何隐藏iOS标签栏并填充它留下的空间
【发布时间】:2014-12-13 08:17:54
【问题描述】:

我无法使用隐藏 UITabBar 留下的空间。

我有一个带有 UINavigationController 的 UITabBarController,它的根视图控制器只有一个 UIWebView。当我隐藏导航/状态栏时,我正在使用自动布局约束使 webview 填充工作正常的视图(并填充可用空间)。

但是,当我隐藏标签栏(使用setNavigationBarHidden)时,标签栏被隐藏,但它腾出的空间没有被 webview 用完,正如预期的那样。

搜索类似问题建议在推送视图之前使用hidesBottomBarWhenPushed。我不想在旋转设备时推动另一个 VC(或必须重新加载 webview)。其他人建议调整框架的大小(如 https://stackoverflow.com/a/1554637/1429412 ),但我无法成功地做到这一点。

在一个方向隐藏标签栏而不是另一个方向并让视图填充标签栏腾出的空间的最佳方法是什么?

纵向屏幕截图,在状态/导航栏和标签栏后面显示绿色背景的 UIWebview:http://i.stack.imgur.com/Hzj9k.png

显示隐藏状态/导航栏和标签栏的横向屏幕截图。 webview 内容已扩展到顶部(导航栏),但没有扩展到底部(标签栏)。然而,webview 本身(唯一具有绿色背景的元素)已经向下扩展,而不是它的内容(不管长度):http://i.stack.imgur.com/sdk75.png

如果我在运行时检查视图(使用 FLEX),然后单击可视内容区域,它会显示具有较短 271 高度的 UIWeBrowserView 视图。单击标签栏空间所在的区域将显示具有完整 320 高度的 _UIWebViewScrollView。在代码中,我可以看到 UIWebView 的 .contentSize 只有 568x271。我尝试了在 webview 及其子视图上设置框架的各种组合,但没有成功。

现在,没有任何调整框架大小的技巧,代码很简单:

- (void)willRotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration {
    [[self navigationController] setNavigationBarHidden:UIInterfaceOrientationIsLandscape(toInterfaceOrientation) animated:YES];
    [[UIApplication sharedApplication] setStatusBarHidden:UIInterfaceOrientationIsLandscape(toInterfaceOrientation) withAnimation:UIStatusBarAnimationSlide];
    self.tabBarController.tabBar.hidden = UIInterfaceOrientationIsLandscape(toInterfaceOrientation);
}

我将 xCode 6.1 用于 iOS7+ 项目。

接下来我该怎么做?提前感谢您的任何指点!

【问题讨论】:

    标签: ios objective-c uiwebview uitabbarcontroller


    【解决方案1】:

    这只是 Tabbar 的工作方式,唯一允许覆盖选项卡的 UIView 形式是模态视图 presentviewcontroller ....dismissviewcontroller Apple 有很多示例,只需搜索即可。

    【讨论】:

    • 我不反对,但它是经常使用的用户体验。就像在库存照片应用程序中查看照片时点击以显示/隐藏一样。他们是否真的为照片创建了另一个 UIImageView 的第二个视图并在点击时呈现/关闭它? (感谢您的反馈!)
    • 我很确定当您点击屏幕时,照片应用会使用模态视图和 UITapresponder。 ....检查背景颜色的变化。对于 iPad 应用程序,他们有这个弹出视图来代替完全覆盖屏幕的模式 - 但我相信你知道。