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

时间:2016-01-05 09:25:05

标签: ios objective-c xcode xcode-storyboard

我有一个视图控制器,可以在整个屏幕上显示内容,包括状态栏和导航栏后面的内容。这些条可以被隐藏/不隐藏,并且因此,控制器不断覆盖self.view.frame以保持覆盖整个屏幕的内容(即,当条重新出现时阻止自动布局稍微向下移动内容,移动它当他们消失时)内容是滚动视图,嵌套在内部的是可以通过滚动视图缩放的图像视图。该控制器始终由父控制器推动,并具有垂直封面动画。

然而,我遇到的问题是,首次出现时,滚动视图的框架设置不正确,因此,图像最初偏离中心,并且似乎正确地“跳转”到它动画完成后居中的位置,主线程恢复布局功能而不是动画。在最初的问题之后,一切都按预期工作。

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

1 个答案:

答案 0 :(得分:0)

这个问题真的让我感到烦恼,我尝试了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进行更新。