【发布时间】:2017-10-13 13:35:59
【问题描述】:
我正在快速设计一个 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
【问题讨论】:
-
不知道我是否正确理解了您的问题,但我会使用 UIViewControllerAnimatedTransitioning:隐藏您正在转换的视图控制器的导航栏,重新创建它并将其添加到上下文中,根据需要为其高度设置动画,当动画结束时,将其从上下文中移除并取消隐藏目标控制器的导航栏。在用户眼中,这一切看起来都是无缝的
-
所以,我不想对导航栏做任何事情,而且由于我只是推送到导航控制器,因此新视图没有导航栏。我遇到的问题是,当 UINavigationController 的高度在视图被推送到它之前被动画时,被推送到导航控制器的视图的高度具有未来的动画高度,而不是被限制在其包含导航的底部控制器。我不会从这个故事板过渡,只是将视图推送到其中的导航控制器。
标签: ios swift animation uinavigationcontroller