【发布时间】:2015-07-24 00:14:03
【问题描述】:
我关注了这个blog post,它解释了如何实现一个增加高度的自定义UINavigationBar,例如,如果您想在导航栏中放置其他将持续存在的栏内容下方的额外 ui 元素在堆栈上的导航之间。在您总是希望它增加高度的情况下,此代码非常有效。
在我的应用程序中,我需要在默认高度启动导航栏,然后在用户执行给定操作后增加它,添加更多内容。与 iTunes Store 中的歌曲信息和控件非常相似:
因此,如果BOOL 属性为NO,我会进行一些检查以不重新定位任何内容。当我将它设置为YES 时,我调用[self setNeedsDisplay],它将调用layoutSubviews 根据该布尔值适当地定位所有内容。 sizeThatFits 也被调用,我返回正确的高度。
问题是,我无法在initialize 中调用[self setTransform:CGAffineTransformMakeTranslation(0, -(NavigationBarHeightIncrease))];。相反,我同时将布尔值更改为YES。正因为如此,我所有的元素都上移了那个数量。但是如果我不调用setTransform,导航栏中的元素位于正确的位置,但导航栏本身的位置太低了,因此我添加到导航栏中的自定义视图显示在视图上方控制器的视图 - 它流血了,我添加的额外空间是黑色而不是导航栏的背景颜色。
如果我在initialize 中调用setTransform,当高度是默认高度时,元素会在不应该的时候向上移动。
那么,如何正确地动态更改UINavigationBar 子类的高度和位置?
【问题讨论】:
-
我不建议改变 UINavigationBar-s 的高度或其实现,你永远不知道在下一个 iOS 版本之后 UINavigationBar 会发生什么变化,相反,我会使用自定义 UIView ,具有相同的背景/样式并将其附加到顶部布局指南,然后您可以轻松地操作您的视图而无需私有 apis
-
@ogres 不幸的是,我需要这个自定义视图在推送和弹出操作之间持续存在,所以我不能将它添加到视图控制器的视图中 - 它需要以某种方式绑定到导航控制器/栏。
-
为什么不创建一个RootView控制器,然后在里面包含导航控制器呢?那么你可以维护视图
-
@ogres 也许这是一个解决方案。只是不确定这在实践中是如何工作的,愿意提供有关您如何处理它的答案吗?
-
我只能给出一个建议,但不能真正回答你的问题,我已经尝试过类似的方法,但仅限于 UITabBarViewController,不确定它是否也适用于 UINavigation,例如:创建 UIViewController ,创建 UINavigationViewController (你当前的根视图),在添加 UINavigationvc-s 视图作为 uiviewcontroller 的子视图,并将 uinavigationvc 作为 uiviewcontroller 的子控制器,然后看看它是否有效,现在你可以向 UIViewcontroller 添加任何视图,它将在所有导航中可用推动
标签: ios uinavigationbar