我正在设计一个swift的iOS应用程序,我在控制器转换期间遇到动画困难。具体来说,我已经实现了一个UINavigationControllerDelegate,用于监听推送某个视图的时间。按下此视图时,我想隐藏屏幕底部的一个栏。我的代码几乎完美地运行,但是每当我在导航控制器的高度上开始动画时,当前视图(正被删除)正确地设置其高度的动画,但是被推动的新控制器已经具有新的高度。动画。为了给它添加一些代码,从我的UINavigationControllerDelegate的willShow viewController函数调用以下函数:
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
如您所见,当新控制器已具有新的动画大小时,旧视图控制器会正常动画。
任何帮助都会非常感激。我一直试图解决这个问题一段时间没有成功。
编辑:未应用* 2的动画视图。 https://imgur.com/a/2a5Sw
答案 0 :(得分:0)
您是否考虑过不使用UINavigationController?也许使用ChildViewControllers
机制会更容易。然后使用它可以使用强大的自动布局,并且可以更好地控制动画(在你的情况下是高度)
有关此here
的详细信息答案 1 :(得分:0)
我创建了一个很好的小样本项目,你可以找到here!
有很多事情可能会出错,而且由于我没有亲自查看你的项目,我可能会在样本中对事情进行非常不同的组织,但希望你能理解它。我认为最重要的是我在storyboard中向navigationController的容器添加了一个约束到根viewController的底部。当我制作动画时,我根本不调整这个容器的高度。