为什么不应该修改UINavigationController的工具栏?

3
UINavigationController中的toolbar属性文档说:
该属性包含对导航控制器管理的内置工具栏的引用。仅为希望从工具栏呈现操作表的客户端提供对此工具栏的访问。您不应直接修改UIToolbar对象。
我可以理解为什么不应该修改工具栏的可见性或项,因为UINavigationController提供了一个界面来完成这个操作。但是当我添加一个按钮时,点击它会使工具栏动画离开屏幕。为什么我不能这样做?
难道我必须创建自己的ToolbarNavigationController类,复制UINavigationController与工具栏相关的所有内容,以便我可以随心所欲地使用工具栏吗?既然UINavigationController已经实现了我想要的功能,那么这样做似乎很浪费精力。为什么文档建议我如此严格限制对它的使用呢?

UINavigationControllers 对其公开属性非常挑剔。我认为你不太可能在这里找到一个不是猜测的好答案。 - CodaFi
@CodaFi 虽然这并不让我感到惊讶,但并没有提供太多的满足感。 :-( 谁知道呢,也许有人真的知道! - theory
如果您可以访问并修改工具栏,您会怎么做呢?(附注:在SO上可能有一些隐秘的苹果员工拥有这方面的知识,但我认为他们不会轻易地放弃它;p)。 - CodaFi
坦白地说,我所做的只是将其动画化并移出屏幕。这就是全部。我有一个按钮,当点击它时,将工具栏移出屏幕,然后移动不同的工具栏。不同的工具栏代表不同的模式。我真的不认为在这种情况下会有任何人反对;只是文档中的评论让我停顿了一下。 - theory
2个回答

2
移动导航栏可能会导致以下三种混淆情况:
  1. 如果您的应用程序可以旋转,旋转后它是否仍停留在正确的位置?当它返回到屏幕上时,它是否从正确的位置进行动画处理?
  2. 如果您显示搜索栏,导航栏会自动动画关闭。如果已经手动移动了导航栏,它是否知道自己的位置?
  3. 如果您推送一个设置为YEShidesBottomBarWhenPushedviewController,并返回,navigationController是否将其工具栏放回原位?
另一方面,调用UINavigationController setNavigationBarHidden:NO animated:YES会做你想要的事情,同时让导航控制器保持对其工具栏的控制。
编辑:很抱歉我误读了。是的,只要您不执行任何操作(例如上面的第3项)导致navigationController移动其工具栏,您可能可以做到您所要求的。
另一方面,您想要的行为也可以通过以下方式实现:
  1. 对于具有多个工具栏的viewController,将其hidesBottomBarWhenPushed设置为YES
  2. viewController需要的所有工具栏放在上面,并完全控制它们的位置和可见性。
如果默认工具栏具有与navigationController自己的工具栏相同的布局,则会创建奇怪的视觉效果,即看到相同的工具栏项目滑出然后再次滑入,但其他所有内容都应该正常工作。

我想要更改的不是导航栏(我的应用程序已将其隐藏,根本没有使用它)。而是工具栏。-setToolbarHidden:animated并不能做到我想要的,因为它会调整当前显示的视图的大小。 - theory
谢谢。是的,但由于我计划要做的另一件事情之一是更改推送和弹出动画,所以我可能会编写自己的ToolbarNavigationController。(实际上,我已经开始了一个:https://github.com/lunar-theory/LTToolbarNavController)。但目前来看,似乎动画UINavigationController工具栏,所以暂时还是会坚持使用它。正如你所说(@CodaFi似乎也同意),这可能不会造成任何伤害。 - theory

0

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


我这样做。嗯,类似的(我改变了框架)。我的问题是:为什么我不应该这样做? - theory
你应该这样做。我正在进行中。 - CodaFi
你在哪里更改工具栏的框架?它在iOS 8中仍然能够正常工作吗? - SAHM

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接