【问题标题】:iOS7 Custom Transitions with UINavigationController带有 UINavigationController 的 iOS7 自定义转换
【发布时间】:2013-10-11 12:19:09
【问题描述】:
我正在使用 iOS7 自定义转换以模态方式呈现新的视图控制器。
新的视图控制器是一个导航控制器。
控制器从底部向上动画,而背景视图模糊。
我的问题是新控制器上的导航栏虽然向上动画,但似乎允许状态栏,即它似乎是 64 点高。当它到达最终位置并调用 completeTransition 时,它意识到不需要状态栏空间并快速返回 44 点。
有没有办法
- 最初通知导航控制器/顶视图控制器不需要状态栏。
或
- 在动画之前调用 completeTransition 调用的任何方法,以便随后进行自动重新调整。
制作动画时:
动画完成:
【问题讨论】:
标签:
ios
uinavigationcontroller
ios7
uistatusbar
【解决方案1】:
诀窍是在将其初始位置设置为离开屏幕底部之后,将呈现的视图控制器的视图添加到容器视图中。这可以防止容器视图认为它位于屏幕顶部并相应地自动布局并提供状态栏。
来自WRESTLING WITH STATUS BARS AND NAVIGATION BARS ON IOS 7与以下相关:
“UINavigationController 将根据一组相当奇怪且未记录的约束将其 UINavigationBar 的高度更改为 44 点或 64 点。如果 UINavigationController 检测到其视图框架的顶部与其 UIWindow 的顶部在视觉上是连续的,然后它绘制高度为 64 点的导航栏。如果它的视图顶部与 UIWindow 的顶部不连续(即使仅相差一个点),那么它以“传统”方式绘制高度为44 分。这个逻辑由 UINavigationController 执行,即使它是应用程序的视图控制器层次结构中的几个子级。没有办法阻止这种行为。"
【解决方案3】:
UINavigationBar 也有类似的问题。
在一种情况下,它位于自定义拆分视图中(我们不能使用 UIKit,因为在 iOS 5.0 中缺少一些功能)以及 UINavigationController 将其视图添加到另一个视图中。
控制器层次结构的使用在这里有很大帮助,iOS 在决定如何布局 UINavigationBar 时似乎也注意了这一点。我能够拥有一个由操作系统定义的具有正确高度的 UINavigationController,而不需要 UINavigationBar 与其 UIWindow 的顶部连续,所以这是可能的。
但是有一个问题,当视图第一次出现时,它的高度不正确,然后自动增加到 64 像素的正确高度。
从一开始就获得具有正确高度的视图的解决方案是最初使用屏幕的整个宽度定义视图,然后使用 [UIViewController viewDidLayoutSubviews] 方法以我想要的宽度定义视图的框架.
这意味着控制器正在按照我想要的方式进行 UINavigationBar 的布局,然后我会更正视图的框架,这不会改变 UINavigationBar 的高度。
对于OP呈现的具体情况,你可以反其道而行之。首先定义一半宽度的视图,使栏在开始时很小,然后将宽度改回您想要的宽度。我在另一种情况下对此进行了测试,它也有效,但它没有动画,这可能会扼杀我的解决方案。我建议更改宽度和 x 位置。
这是一个可怕的 hack,所以如果有人想出一个可以让我删除此代码的解决方案,请分享。