2017-05-14 109 views
4

我正在设计一个swift的iOS应用程序,并且在控制器转换期间我有一些动画难度。具体来说,我已经实现了一个UINavigationControllerDelegate,来监听某个视图何时被推送。当这个视图被按下时,我想隐藏屏幕底部的一个条。我的代码几乎完美地工作,但是无论何时我在导航控制器的高度上开始动画时,当前视图(正在被删除)正确地为其高度设置了动画,但是正在被推送的新控制器已经从动画。把一些代码,执行下面的功能是从我UINavigationControllerDelegate的willShow的viewController函数调用:在控制器转换期间动画UINavigationController高度

func animatePlayerVisibility(_ visible: Bool) { 

    if visible == showingPlayer { 
     return 
    } 
    showingPlayer = visible 

    let height: CGFloat = visible ? 56.0 : 0.0 
    self.view.layoutIfNeeded() 
    UIView.animate(withDuration: 0.35) { 
     self.playerHeight.constant = height 
     self.viewBottom.constant = height 
     self.view.layoutIfNeeded() 
    } 
} 

“playerHeight”是一个IBOutlet到播放器上的容器视线的高度约束。 'viewBottom'也是顶部容器视图底部和屏幕底部之间的IBOutlet约束。从本质上讲,只要这两个约束一起动画,它应该看起来不错。

为了帮助可视化的图形错误,我编辑这行

self.viewBottom.constant = height 

self.viewBottom.constant = height * 2.0 

我在操作创建实际的错误行为的imgur专辑: http://imgur.com/a/znAim

正如你所看到的,当新的控制器已经拥有新的动画大小时,旧的视图控制器可以正常动画。

这里是我的故事板的布局: Storyboard

任何帮助将非常感激。我一直在试图解决这一段时间没有成功。

编辑:没有应用* 2的动画视图。 https://imgur.com/a/2a5Sw

+0

不知道我是否正确理解你的问题,但我会使用UIViewControllerAnimatedTransitioning:隐藏你正在转换的视图控制器的导航栏,重新创建并将其添加到上下文中,将其高度动画为当动画结束时,将其从上下文中移除并取消隐藏目标控制器的导航栏。它在用户眼中似乎都是无缝的 – cyril

+0

所以,我不想对导航栏做任何事情,因为我只是推送到导航控制器,所以新视图没有导航栏。我遇到的问题是,当一个UINavigationController的高度在视图被推到它之前动画时,被推送到导航控制器的视图的高度具有未来的动画高度,而不是被限制到其包含的导航的底部控制器。我不想从这个故事板过渡,只是将视图推向其中的导航控制器。 – Jtvd78

回答

0

你有没有想过不使用UINavigationController?也许这会更容易使用ChildViewControllers机制。然后,你可以使用一个强大的自动版式,并有更多的控制权动画(在你的案件高度)

更多信息有关此here

+0

你认为你可以提供一些关于如何去做这件事的更多细节?大多数指南都是针对非默认外观转换行为,但我打算过渡到仍然看起来'股票' – Jtvd78

+0

你是什么意思'股票'? –

+0

传入视图从左向右滑动。现在我想要做的就是改变UINavigationController的高度,但是当我在转换之前激活高度动画时,即使动画还没有完成,传入视图也会有新的高度。我不需要任何花哨的过渡。 – Jtvd78

0

我创建了一个可爱的小样本项目,你可以找到here

有很多事情可能会出错,而且由于我没有亲自查看过您的项目,所以我可能在样本中组织了非常不同的事情,但希望您能理解它。我认为最重要的是我在storyboard中为navigationController的容器添加了一个约束到根viewController的底部。动画时,我根本没有调整这个容器的高度。

+0

我同意这会工作,但是然后我尝试将其放入UINavigationController的每个视图都必须实现代码以确定它是否应该变小。它看起来像是UINavigationController的默认转换,它将新推动的控制器的高度设置为未来的动画高度,而不是将推送的视图限制在导航控制器视图的底部。这是我可以用UIViewControllerAnimatedTransitioning修改吗? – Jtvd78

+0

我只是想澄清一下,我不是从一个故事板移动到另一个故事板。我只是将视图推向UINavigationController。我知道我的故事板并不常见,因为我是从Android开发而来的,但我不认为这个问题与故事板本身有关,而只是UINavigationController的默认行为。我已经用动画的一个不夸张的版本更新了主帖。感谢您到目前为止的帮助 – Jtvd78

+0

嗯第二个示例现在有一点帮助,我注意到您的根控制器是pageController。让我看看我是否可以快速举一个例子,稍后我会再回来查看 – mmd1080

相关问题