4

我正在使用 iOS7 自定义转换以模态方式呈现一个新的视图控制器。

新的视图控制器是一个导航控制器。

控制器从底部向上动画,而背景视图模糊。

我的问题是新控制器上的导航栏虽然向上动画,但似乎允许状态栏,即它似乎是 64 点高。当它到达最终位置并调用 completeTransition 时,它意识到不需要状态栏空间并快速返回 44 点。

有没有办法

  • 最初通知导航控制器/顶视图控制器不需要状态栏。或者
  • 在动画之前调用 completeTransition 调用的任何方法,以便随后进行自动重新调整。

动画时:

制作动画时

动画完成:

动画完成

4

3 回答 3

7

诀窍是在将其初始位置设置为离开屏幕底部之后,将呈现的视图控制器的视图添加到容器视图中。这可以防止容器视图认为它位于屏幕顶部并相应地自动布局状态栏。

它与IOS 7 上的状态栏和导航栏摔跤有关:

“UINavigationController 会将其 UINavigationBar 的高度更改为 44 点或 64 点,具体取决于一组相当奇怪且未记录的约束。如果 UINavigationController 检测到其视图框架的顶部与其 UIWindow 的顶部在视觉上是连续的,那么它会绘制它的导航栏的高度为 64 点。如果它的视图顶部与 UIWindow 的顶部不连续(即使仅相差一个点),那么它以“传统”方式绘制其高度为 44 点的导航栏。这个逻辑由 UINavigationController 执行,即使它是应用程序的视图控制器层次结构中的几个子级。没有办法阻止这种行为。

于 2013-10-11T13:31:34.617 回答
0

UINavigationBar 也有类似的问题。

在一种情况下,它位于自定义拆分视图中(我们不能使用 UIKit,因为 iOS 5.0 中缺少一些功能)以及 UINavigationController 将其视图添加到另一个视图中。

控制器层次结构的使用在这里有很大帮助,似乎 iOS 在决定如何布局 UINavigationBar 时也会注意这一点。我能够拥有一个由操作系统定义的正确高度的 UINavigationController,而无需 UINavigationBar 与其 UIWindow 的顶部连续,因此可以这样做。

但是有一个问题,当视图第一次出现时,它的高度不正确,然后自动增加到 64 像素的正确高度。

从一开始就获得具有正确高度的视图的解决方案是最初使用屏幕的整个宽度定义视图,然后使用 [UIViewController viewDidLayoutSubviews] 方法以我想要的宽度定义视图的框架。

这意味着控制器正在按照我想要的方式进行 UINavigationBar 的布局,然后我将更正视图的框架,这不会改变 UINavigationBar 的高度。

对于OP提出的具体情况,你可以反其道而行之。首先定义一半宽度的视图,使栏在开始时很小,然后将宽度改回您想要的宽度。我在另一种情况下对此进行了测试,它也有效,但它没有动画,这可能会扼杀我的解决方案。我建议更改宽度和 x 位置。

这是一个可怕的 hack,所以如果有人想出一个允许我删除此代码的解决方案,请分享。

于 2013-12-10T15:37:05.680 回答
0

艾伦,由于您尚未将问题标记为已回答,因此我将其提出,以便其他人可以找到。我遇到了类似的情况,你的修复在我的情况下不起作用,所以这个更通用的解决方案可能会更有帮助。

在这里找到导航栏在 iOS 7 中模式化具有翻转水平过渡的视图控制器时位置错误

一个快速的解决方法是:

[self.navigationController.navigationBar.layer removeAllAnimations];    

在您要转换到的视图的 viewWillAppear 中。这将避免需要先将您的视图放在屏幕下方,然后在制作动画之前将其向上移动。

正如您在上面指出的那样, UINavigationController 在某个时候会计算出它的大小,这与动画冲突。

于 2013-11-11T19:09:48.783 回答