2013-10-11 59 views
4

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

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

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

我的问题是,新控制器上的导航栏,虽然向上动画,似乎允许状态栏,即它似乎是64点高。当它到达最终位置并称为completeTransition时,它实现了不需要状态栏空间,并重新回到44点。

有没有办法来

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

虽然动画:

While animating

动画完成:

Animation complete

回答

7

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

它与下面从WRESTLING WITH STATUS BARS AND NAVIGATION BARS ON IOS 7

“的UINavigationController将改变其UINavigationBar的的要么44点或64点的高度,这取决于一个相当奇怪和无证约束集合如果UINavigationController的检测。其视图框架的顶部与UIWindow的顶部视觉连续,然后绘制其导航栏的高度为64点,如果其视图的顶部与UIWindow顶部不连续(即使仅关闭一个点),则它以“传统”方式绘制其导航栏,高度为44点,即使在应用程序的视图控制器层次结构中存在多个子项,该逻辑也由UINavigationController执行。没有办法阻止这种行为。“

+0

现在似乎很明显... – maxhs

0

艾伦,因为你没有标记你的问题回答我把这个,所以其他人可以找到它。我遇到了类似的情况,你的修复程序在我的情况下不起作用,所以这种更一般的解决方案可能会更加广泛地有用

发现在这里Navigation bar has wrong position when modal a view controller with flip horizontal transition in iOS 7

快速解决方法是将:

[self.navigationController.navigationBar.layer removeAllAnimations];  

在要转换到视图的viewWillAppear中。这将避免首先将视图放置在屏幕下方,然后在动画之前将其移动。

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

0

我有类似的UINavigationBar问题。

在一种情况下,它是在自定义拆分视图中(我们无法使用UIKit之一,因为iOS 5.0中缺少一些功能),并且还有将视图添加到另一个视图中的UINavigationController。

控制器层次结构的使用在这里有很多帮助,看起来iOS在决定如何布局UINavigationBar时也注意一些。我可以在操作系统定义正确的高度的情况下拥有一个UINavigationController,而不必将UINavigationBar与UIWindow的顶部连接起来,这样就可以做到。

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

从一开始就以正确的高度获取视图的解决方案是首先定义具有整个屏幕宽度的视图,然后使用[UIViewController viewDidLayoutSubviews]方法来定义宽度为I的视图的框架通缉。

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

对于OP提出的具体情况,您可以做相反的事情。首先用宽度的一半来定义视图,这样在开始时条形很小,然后将宽度更改为所需的宽度。我在另一种情况下测试了它,它也起作用,但它没有动画,可能会导致我的解决方案失效。我建议改变宽度和x位置。

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

相关问题