为啥我不应该修改 UINavigationController 的工具栏?

Posted

技术标签:

【中文标题】为啥我不应该修改 UINavigationController 的工具栏?【英文标题】:Why shouldn't I modify the UINavigationController's toolbar?为什么我不应该修改 UINavigationController 的工具栏? 【发布时间】:2012-04-11 04:30:09 【问题描述】:

UINavigationController 中toolbar 属性的文档说:

此属性包含对导航控制器管理的内置工具栏的引用。此工具栏的访问权仅提供给希望从工具栏中显示操作表的客户。您不应该直接修改 UIToolbar 对象。

我可以理解为什么我不应该修改工具栏的可见性或项目,因为 UINavigationController 提供了一个接口来做到这一点。但是我添加了一个按钮,当点击该按钮时,工具栏会在屏幕外显示动画。为什么我不应该这样做?

我是否必须创建自己的 ToolbarNavigationController 类来复制 UINavigationController 对工具栏所做的一切只是草皮,我可以用工具栏做我想做的事吗?当 UINavigationController 已经做了我想要的事情时,这似乎是一种浪费。为什么文档会建议我如此严格地限制我用它做的事情?

【问题讨论】:

UINavigationController 对其暴露的属性是出了名的挑剔。我认为你不可能在这里找到一个不是猜测的好答案。 @CodaFi 虽然这不会让我感到惊讶,但它并没有提供太多的满足感。 :-(谁知道呢,也许真的有人知道! 如果您可以访问并修改上述工具栏,您会怎么做? (PS,SO 上可能有一些不公开的苹果员工知道这方面的知识,但我认为他们不会轻易放弃它;p)。 坦率地说,我所做的只是在屏幕外设置动画。就是这样。我有一个按钮,当点击它时,将工具栏移出屏幕,然后移动另一个工具栏。不同的工具栏代表不同的模式。我真的认为在这种情况下没有人会反对。只是文档中的评论让我停下来。 【参考方案1】:

移动导航栏的三种方式可能会混淆它:

    如果您的应用程序可以旋转,它是否在旋转后停留在正确的位置?当它返回屏幕时,它是否从正确的位置开始动画? 如果显示搜索栏,导航栏会自动关闭。如果它已经被手动移动过,它知道它在哪里吗? 如果将hidesBottomBarWhenPushed 设置为YESviewController 推送并返回,navigationController 是否会将其工具栏放回它所属的位置?

另一方面,调用UINavigationController setNavigationBarHidden:NO animated:YES 怎么样 - 这样做是否符合您的要求,同时让导航控制器保持对其工具栏的控制?

编辑:抱歉误读。是的,您可能可以按照您的要求进行操作,只要您不执行任何意味着 navigationController 移动其工具栏的操作(如上面的第 3 项)。

另一方面,你想要的行为也可以如下实现:

    对于具有多个工具栏的viewController,将其hidesBottomBarWhenPushed 设置为YES。 将viewController 需要的所有工具栏放在上面,让它完全控制它们的位置和可见性。

如果默认工具栏与 navigationController 自己的工具栏布局相同,这将产生奇怪的视觉效果,看到同一组工具栏项目滑落然后又滑落,但其他一切都应该正常工作。

【讨论】:

这不是我想弄乱的导航栏(我的应用程序隐藏了它,根本不使用它)。它是工具栏。不,-setToolbarHidden:animated 不会做我想做的事,因为它会调整当前显示的视图的大小。 谢谢。是的,但是由于我计划做的其他事情之一是更改推送和弹出动画,我不妨编写自己的 ToolbarNavigationController。 (我实际上是started one already。)但现在看来,动画 UINavigationController 工具栏,所以可能会暂时坚持下去。正如你所说(@CodaFi 似乎也同意),它可能不会造成任何伤害。【参考方案2】:

UIToolbar 不可访问,因为它不需要 可访问。它对 +appearance 的响应很好。在您的情况下,您可以访问只读变量的属性(查看 CGRect!)。如果您需要在屏幕外为 UIToolbar 或 UINavigatiomBar 设置动画,请将其 frame.center 属性设置为 UIView 动画块中的 CGPointMake。

【讨论】:

我愿意。好吧,类似(我改变了框架)。我的问题是:我为什么不应该? 你应该。我现在正在做。 你在哪里改变工具栏的框架?它在 ios 8 中还能正常工作吗?

以上是关于为啥我不应该修改 UINavigationController 的工具栏?的主要内容,如果未能解决你的问题,请参考以下文章

为啥我不应该包含 cpp 文件而使用标头?

ReactJS:为啥我不应该改变嵌套状态?

UISplitViewController:为啥我不应该在导航或标签栏界面中显示它?

为啥我不应该让一个类可序列化?

为啥我不应该在访问对象之前使用“if Assigned()”?

为啥我不应该将 virtualenv 推送到 Heroku?