如何在 segue 动画之前强制布局?

Posted

技术标签:

【中文标题】如何在 segue 动画之前强制布局?【英文标题】:How do I force layout before segue animation? 【发布时间】:2016-01-05 09:25:04 【问题描述】:

我有一个视图控制器,可以全屏显示内容,包括在状态栏和导航栏后面。这些栏可以切换隐藏/不隐藏,因此,控制器不断覆盖 self.view.frame 以保持内容覆盖全屏(即防止自动布局在栏重新出现时稍微向下移动内容,移动它当他们消失时,起来)。内容是一个滚动视图,里面嵌套的是一个可以被滚动视图缩放的图像视图。这个控制器一直被父控制器推送,并且有垂直覆盖动画。

但是,我遇到了一个问题,即当它第一次呈现时,滚动视图的框架设置不正确,因此,图像最初是偏离中心的,并且看起来会“跳转”到正确的位置动画完成后居中位置,主线程恢复布局功能而不是动画。在最初的问题之后,一切都按预期工作。

如果我完全禁用动画,它会按预期工作。我相信它与视图控制器的生命周期有关。在 viewDidLoad 期间,滚动视图的帧大小不正确(笔尖默认值),并且在调用 layoutSubviews 之前不会被自动布局纠正。但是,我需要在此之前设置框架,因为在此期间演示动画已经开始工作。我也不能禁用自动布局,除非它仅适用于这个特定的视图控制器。

【问题讨论】:

嗨。我遇到了同样的问题。你找到解决方案了吗? 【参考方案1】:

这个问题真的困扰着我,我尝试了 viewDid* 方法的每一个变体,当我决定尝试这个时,我正准备尝试自定义 segue...

在呈现视图控制器上...

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender

    UIViewController *vc = [segue destinationViewController];
    [vc.view setNeedsLayout];
    [vc.view layoutIfNeeded];

注意,仅仅调用 [vc.view layoutSubviews] 不会像here 中描述的那样做任何事情,你需要使用 setNeedsLayout 然后调用 layoutIfNeeded。

在目标视图控制器中,使用- (void)viewDidLayoutSubviews 进行更新。

【讨论】:

以上是关于如何在 segue 动画之前强制布局?的主要内容,如果未能解决你的问题,请参考以下文章

seguing ios时避免底栏隐藏跳转

提交前 Swift segue 自定义转换布局

如何将视图控制器动画转换转换为 Segue 动画转换

如何在没有动画的情况下执行 unwind segue?

自定义 Segue 在显示目标视图控制器之前动画为黑色

swift 4 - segue 动画完成后如何在目标视图控制器中运行代码?