如何在 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 动画之前强制布局?的主要内容,如果未能解决你的问题,请参考以下文章