我按照这个blog post解释了如何实现高度增加的自定义UINavigationBar
,例如,如果您想在条形图其余部分下方的导航栏中添加其他ui元素将在堆栈导航之间保留的内容。这段代码非常适用于你总是希望它增加高度的情况。
在我的应用中,我需要以默认高度启动导航栏,然后在用户执行给定操作后增加更多内容。与iTunes Store中的歌曲信息和控件非常相似:
因此,如果BOOL
属性为NO
,我会进行一些检查,以便不重新定位任何内容。当我将其设置为YES
时,我会调用[self setNeedsDisplay]
,它会调用layoutSubviews
根据该布尔值适当地定位所有内容。 sizeThatFits
也被调用,我返回适当的高度。
问题是,我无法在[self setTransform:CGAffineTransformMakeTranslation(0, -(NavigationBarHeightIncrease))];
中致电initialize
。相反,我在调用它的同时将布尔值更改为YES
。因此,我的所有元素都会向上移动。但是,如果我不打电话给setTransform
,导航栏中的元素位于正确的位置,但是栏位本身位置太远,因此我自定义的视图已添加到条形图显示在视图控制器的视图上方 - 它会流出,我添加的额外空间是黑色而不是导航栏的背景颜色。
如果我在setTransform
中拨打initialize
,当高度为默认高度时,元素会在不应该移动时向上移动。
那么,我怎样才能正确地动态改变UINavigationBar
子类的高度和位置?
答案 0 :(得分:1)
正如评论中所建议的,为了实现自定义导航栏(不是子类化本机控件)在导航控制器中的控制器的推送和弹出中持续存在的行为,您需要使用单个控制器自定义导航栏,然后是单个嵌入式视图,解析为UINavigationController
,其视图控制器位于下方。然后,还需要将导航控制器的委托设置到根控制器,以便在推送和弹出子控制器时更新标题和其他属性。我已经在下面提供了截图,说明了这个故事板版本的样子:
答案 1 :(得分:0)
一个选项是在故事板中创建一个UIViewController,它只有你想要显示在导航栏下方的控制视图,其他一切都是透明的。这里的优点是您可以使用常规工具进行设计。使用约束将其放置在导航栏的下方,并设置视图的高度,宽度等。
当您希望显示控件时,您可以创建此UIViewController的实例并从中删除内容视图,并将其添加到屏幕上的视图层次结构中。
有两种方法可以插入提取的基本视图:
如果将此控件视图添加到顶部的视图控制器中 导航堆栈(屏幕上的内容),它将被覆盖 你推动一个新的控制器。这不是你想说的。
如果将此控件视图添加到self.navigationController.view,则 它会在推动和弹出中持续存在。这就是你说的你想要的。
我使用这种方法提供弹出式帮助气泡来描述屏幕上的内容。根据我是使用选项1还是2,我可以在多个推送/弹出中保持帮助。
我从本教程中了解了一般方法:http://blog.typpz.com/2013/12/09/ios-sdk-create-a-pop-up-window/
该链接提供了有关如何调出视图和删除视图的完整代码示例。
这可以让你在IB中进行设计,根据需要显示和解除它,并在导航序列中保留它。
希望这有帮助。