动态增加/减少自定义UINavigationBar的高度

时间:2015-07-17 22:50:58

标签: ios uinavigationbar

我按照这个blog post解释了如何实现高度增加的自定义UINavigationBar,例如,如果您想在条形图其余部分下方的导航栏中添加其他ui元素将在堆栈导航之间保留的内容。这段代码非常适用于你总是希望它增加高度的情况。

在我的应用中,我需要以默认高度启动导航栏,然后在用户执行给定操作后增加更多内容。与iTunes Store中的歌曲信息和控件非常相似:

enter image description here

因此,如果BOOL属性为NO,我会进行一些检查,以便不重新定位任何内容。当我将其设置为YES时,我会调用[self setNeedsDisplay],它会调用layoutSubviews根据该布尔值适当地定位所有内容。 sizeThatFits也被调用,我返回适当的高度。

问题是,我无法在[self setTransform:CGAffineTransformMakeTranslation(0, -(NavigationBarHeightIncrease))];中致电initialize。相反,我在调用它的同时将布尔值更改为YES。因此,我的所有元素都会向上移动。但是,如果我不打电话给setTransform,导航栏中的元素位于正确的位置,但是栏位本身位置太远,因此我自定义的视图已添加到条形图显示在视图控制器的视图上方 - 它会流出,我添加的额外空间是黑色而不是导航栏的背景颜色。

如果我在setTransform中拨打initialize,当高度为默认高度时,元素会在不应该移动时向上移动。

那么,我怎样才能正确地动态改变UINavigationBar子类的高度和位置?

2 个答案:

答案 0 :(得分:1)

正如评论中所建议的,为了实现自定义导航栏(不是子类化本机控件)在导航控制器中的控制器的推送和弹出中持续存在的行为,您需要使用单个控制器自定义导航栏,然后是单个嵌入式视图,解析为UINavigationController,其视图控制器位于下方。然后,还需要将导航控制器的委托设置到根控制器,以便在推送和弹出子控制器时更新标题和其他属性。我已经在下面提供了截图,说明了这个故事板版本的样子:

embedded navigation controller example

答案 1 :(得分:0)

一个选项是在故事板中创建一个UIViewController,它只有你想要显示在导航栏下方的控制视图,其他一切都是透明的。这里的优点是您可以使用常规工具进行设计。使用约束将其放置在导航栏的下方,并设置视图的高度,宽度等。

当您希望显示控件时,您可以创建此UIViewController的实例并从中删除内容视图,并将其添加到屏幕上的视图层次结构中。

有两种方法可以插入提取的基本视图:

  1. 如果将此控件视图添加到顶部的视图控制器中 导航堆栈(屏幕上的内容),它将被覆盖 你推动一个新的控制器。这不是你想说的。

  2. 如果将此控件视图添加到self.navigationController.view,则 它会在推动和弹出中持续存在。这就是你说的你想要的。

  3. 我使用这种方法提供弹出式帮助气泡来描述屏幕上的内容。根据我是使用选项1还是2,我可以在多个推送/弹出中保持帮助。

    我从本教程中了解了一般方法:http://blog.typpz.com/2013/12/09/ios-sdk-create-a-pop-up-window/

    该链接提供了有关如何调出视图和删除视图的完整代码示例。

    这可以让你在IB中进行设计,根据需要显示和解除它,并在导航序列中保留它。

    希望这有帮助。