iOS7与UINavigationController的自定义转换

iOS7与UINavigationController的自定义转换,ios,uinavigationcontroller,ios7,uistatusbar,Ios,Uinavigationcontroller,Ios7,Uistatusbar,我正在使用iOS7自定义转换以模态方式呈现一个新的视图控制器 新的视图控制器是一个导航控制器 控制器从底部向上设置动画,而背景视图模糊 我的问题是,新控制器上的导航栏在向上设置动画时,似乎允许使用状态栏,即它似乎高64点。当它到达最终位置并称为CompletTransition时,它意识到不需要状态栏空间,并快速恢复到44个点 有办法去吗 首先通知导航控制器/俯视控制器不需要状态栏。 或 调用completeTransition在动画之前调用的任何方法,以便随后自动进行重新调整 设置动画时:

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

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

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

我的问题是,新控制器上的导航栏在向上设置动画时,似乎允许使用状态栏,即它似乎高64点。当它到达最终位置并称为CompletTransition时,它意识到不需要状态栏空间,并快速恢复到44个点

有办法去吗

  • 首先通知导航控制器/俯视控制器不需要状态栏。 或
  • 调用completeTransition在动画之前调用的任何方法,以便随后自动进行重新调整
设置动画时:

动画完成:


诀窍是在屏幕底部设置容器视图的初始位置后,将显示的视图控制器的视图添加到容器视图中。这可以防止容器视图认为它位于屏幕顶部,并根据状态栏的规定自动布局

它与以下方面有关:


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

艾伦,因为你没有标记你的问题答案,所以我把它放在上面,以便其他人可以找到。我遇到了类似的情况,你的解决方案在我的情况下不起作用,所以这个更通用的解决方案可能会有更广泛的帮助

在这里找到的

快速解决方法是:

[self.navigationController.navigationBar.layer removeAllAnimations];    
在视图中,将显示您要转换到的视图。这样可以避免在设置动画之前先将视图放置在屏幕下方,然后再将其向上移动


正如您在上面指出的,UINavigationController正在计算某个点的大小,这与动画冲突。

我在UINavigationBar上也有类似的问题

在一个例子中,它是在一个定制的splitview中(我们不能使用UIKit one,因为iOS 5.0中缺少一些功能),并且还带有一个在另一个视图中添加了视图的UINavigationController

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

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

从一开始就获得具有正确高度的视图的解决方案是,首先定义具有整个屏幕宽度的视图,然后使用[UIViewController viewDidLayoutSubviews]方法定义具有所需宽度的视图框架

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

对于OP显示的特定情况,您可以做相反的操作。首先用一半的宽度定义视图,使条在开始时很小,然后将宽度更改回您想要的宽度。我在另一种情况下对此进行了测试,它也起了作用,但它没有动画,这可能会扼杀我的解决方案。我建议更改宽度和宽度x位置

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