在控制器转换期间动画UINavigationController高度

时间:2017-05-14 19:41:10

标签: ios swift animation uinavigationcontroller

我正在设计一个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

如您所见,当新控制器已具有新的动画大小时,旧视图控制器会正常动画。

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

任何帮助都会非常感激。我一直试图解决这个问题一段时间没有成功。

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

2 个答案:

答案 0 :(得分:0)

您是否考虑过不使用UINavigationController?也许使用ChildViewControllers机制会更容易。然后使用它可以使用强大的自动布局,并且可以更好地控制动画(在你的情况下是高度)

有关此here

的详细信息

答案 1 :(得分:0)

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

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