试图用隐藏的 UINavigationBar 实现持久的 UIToolBars 似乎正在操纵未记录的 View 类

Posted

技术标签:

【中文标题】试图用隐藏的 UINavigationBar 实现持久的 UIToolBars 似乎正在操纵未记录的 View 类【英文标题】:Trying to achieve persistent UIToolBars with hidden UINavigationBar appears to be manipulating undocumented View class 【发布时间】:2011-03-26 00:09:34 【问题描述】:

我在窗口的顶部和底部都有一个工具栏。我也在使用 UINavigationController。所以我也想隐藏导航栏。我发现了这个问题:

Persistent UIBarButtonItem in UIToolbar?

所以在应用委托中我做了:

[window addSubview:navigationController.view];
CGRect frame = navigationController.view.frame; // What is this view???
frame.size.height -= (topToolBar.frame.size.height + bottomToolBar.frame.size.height + [UIApplication sharedApplication].statusBarFrame.size.height);
frame.origin.y += topToolBar.frame.size.height + [UIApplication sharedApplication].statusBarFrame.size.height;
navigationController.view.frame = frame;
[navigationController setNavigationBarHidden:YES];

工具栏在 IB 中链接。这是你可以看到的:

状态栏。好的。 一半顶部工具栏 导航栏遮住了顶部工具栏的下半部分和一些加载的视图。 您的第一个视图,顶部有一小部分被导航栏隐藏。 底部工具栏没问题。

setNavigationBarHidden 似乎只是将导航栏移开。我可以通过在导航栏(或 UINavigationBar 上的类别并覆盖 drawRect)上显式设置 hidden=YES 来实现我想要的。

导航控制器上的视图显然是一个 UILayoutContainerView。这似乎是无证的。

所以:

这是一个好方法吗?会被拒绝吗? 为什么会出现这种与导航栏重叠的行为?

【问题讨论】:

我可能会因为这条评论而被否决,但是:为什么要搞乱 UINavigationController?它是一个很好的 UI 组件。如果您不需要它的功能,只需创建自己的视图并使用动画将它们滑入或滑出。 起初我没有任何工具栏,使用 UINavigationController 并隐藏 UINavigationBar 是最简单的方法。我免费获得了视图管理和转换。现在我只是好奇这一切是如何运作的。 【参考方案1】:

我发现这个解决方案有效(不重叠导航栏)

CGFloat height = [self.toolbar frame].size.height;
CGRect rootBounds = self.window.rootViewController.view.bounds;
CGRect frame = CGRectMake(0, CGRectGetHeight(rootBounds) - height, CGRectGetWidth(rootBounds), height);

[self.toolbar setFrame:frame];
[self.navigationController.view addSubview:self.toolbar];

【讨论】:

以上是关于试图用隐藏的 UINavigationBar 实现持久的 UIToolBars 似乎正在操纵未记录的 View 类的主要内容,如果未能解决你的问题,请参考以下文章

使用推送通知启动应用程序时隐藏 UINavigationBar

UINavigationBar+Awesome

带有搜索图标的 UINavigationBar - 单击时推送模态搜索视图

如何隐藏 UINavigationBar 和 UITabBar 动画?

UINavigationBar 隐藏在 statusBar [重复]

如何从 UINavigationController 隐藏 UINavigationBar?