【问题标题】:Animating UINavigationController height during controller transition在控制器转换期间为 UINavigationController 高度设置动画
【发布时间】: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


【解决方案1】:

我创建了一个不错的小示例项目,您可以找到 here

有很多地方可能会出错,而且由于我没有亲自查看过您的项目,因此我在示例中的组织方式可能非常不同,但希望您能理解它。我认为最重要的是我在故事板中添加了一个约束到导航控制器的容器到根视图控制器的底部。我在制作动画时根本不调整这个容器的高度。

【讨论】:

  • 我同意这会起作用,但是我尝试放入 UINavigationController 的每个视图都必须实现代码以确定它是否应该变得更小。看起来 UINavigationController 的默认转换将新推送控制器的高度设置为其未来的动画高度,而不是将推送视图限制在导航控制器视图的底部。这是我可以用 UIViewControllerAnimatedTransitioning 修改的东西吗?
  • 我只是想澄清一下,我不会从一个故事板转移到另一个故事板。我只是将视图推送到 UINavigationController。我知道我的故事板不常见,因为我是在 Android 上开发的,但我认为这个问题与故事板本身无关,而只是 UINavigationController 的默认行为。我已经用动画的非夸张版本更新了主要帖子。感谢您迄今为止的帮助
  • 嗯第二个例子确实有点帮助,因为我注意到你的根控制器是一个pageController。让我看看能不能举个简单的例子,我稍后再回来看看
  • @Jtvd78 查看新示例和说明-如果您有任何问题,请告诉我!
  • 嘿,很抱歉没有回来,但我非常感谢您提供的示例代码。我看到你是如何设置的,这绝对是有道理的。我实际上正在出国旅行,所以直到现在我才有时间查看回复。对我来说它看起来不错,当我开始设计一个受您的样本启发的解决方案时,我一定会通知您。再次感谢
【解决方案2】:

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

更多信息here

【讨论】:

  • 你认为你可以提供更多关于你将如何去做的细节吗?大多数关于这方面的指南都是针对非默认外观的过渡行为,但我打算让过渡看起来仍然“库存”
  • “库存”是什么意思?
  • 传入的视图只是从左向右滑动。现在我想做的就是改变 UINavigationController 的高度,但是当我在转换之前激活高度动画时,即使动画还没有完成,传入的视图也会有新的高度。我不需要任何花哨的过渡。
  • 对不起。我误解了你的问题。我更新了我的答案,也许有帮助。
猜你喜欢
  • 2021-06-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-17
  • 2015-03-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多