【问题标题】:Autolayout - Compressing UINavigationController at the same time as pushing a new view controllerAutolayout - 在推送新视图控制器的同时压缩 UINavigationController
【发布时间】:2014-07-10 00:46:04
【问题描述】:

我正在开发一个 iOS 应用程序。根视图控制器包含一个 UINavigationController 包装应用程序的主要内容,以及一个 footerViewController(音频播放器),它将在动画进入视图时压缩主要内容。

我正在使用自动布局来显示和隐藏此页脚,如下所示:

_footerVisibleConstraints = [… @“V:|[navControllerView][footerView(==90)]|" …];
_footerHiddenConstraints = [… @“V:|[navControllerView][footerView(==0)]|" …];

通常这很好用。但我正在努力解决一个问题。我有一种情况,我需要在 UINavigationController 堆栈上推送一个新视图并同时为我的页脚设置动画:

[self.view layoutIfNeeded];
[UIView animateWithDuration:1.5f animations:^{
  [[self view] removeConstraints:_footerHiddenConstraints];
  [[self view] addConstraints:_footVisibleConstraints];
  [[self view] layoutIfNeeded];
}];

[navigationController pushViewController:newViewController animated:YES];

在这种情况下的问题是 newViewController 动画是在捕捉到它的最终(压缩)状态,而不是从视图的完整起始高度开始。所以当页脚动画进入时,底部有一个间隙。

我已经放慢了动画的速度并发布了一个视频here 来演示我所描述的内容。

另外,请注意当我弹回根视图控制器时,UINavigationController 中的内容也没有被压缩。

那么,有人可以向我解释一下这里发生了什么吗?有没有办法完成我所追求的?

【问题讨论】:

    标签: ios objective-c animation uinavigationcontroller autolayout


    【解决方案1】:

    只需在 VC 的 .h 中添加一个变量来规定页脚是否需要打开。然后将页脚动画添加到 didAppear 方法并检查变量。这将导致按照您希望它们发生的顺序执行操作。

    如果您希望两个动画同时发生,您需要子类化一个 segue 并添加一个自定义动画。

    【讨论】:

    • 是的,如果我使用 newViewController 上的 viewDidAppear 方法来触发页脚动画,它可以正常工作。但我真正想要的是让效果与 viewWillAppear 一起工作,所以感觉就像一个流畅的动画。
    • 就像我在回答中添加的那样,您必须编写自己的 segue 动画。你基本上必须覆盖- (void)perform
    • 因为推送/弹出动画都影响子视图 UINavigationController 视图。这些子视图不应该正确响应其父视图大小的变化吗?它们不是使用自动布局约束进行动画处理吗?例如,如果我的手机是横向/纵向的,所有的连续动画都会正确响应。实际上,我所做的只是改变所有这些对象的 Superview 的大小。即使我要覆盖 perform,我也无法确定我会以不同的方式实现,因为该序列不会真正负责控制超级视图的动画。
    猜你喜欢
    • 2014-12-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-29
    • 1970-01-01
    • 2012-11-08
    • 1970-01-01
    相关资源
    最近更新 更多