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

Ios 如何在segue动画之前强制布局?,ios,objective-c,xcode,xcode-storyboard,Ios,Objective C,Xcode,Xcode Storyboard,我有一个视图控制器,可以在全屏上显示内容,包括在状态栏和导航栏后面。这些条可切换为隐藏/不隐藏,因此,控制器不断覆盖self.view.frame以保持内容覆盖整个屏幕(即,防止自动布局在条重新出现时稍微向下移动内容,在条消失时向上移动内容)。内容是一个滚动视图,其中嵌套的是一个图像视图,可以通过滚动视图进行缩放。该控制器始终由父控制器推动,并且具有垂直覆盖动画 但是,我遇到了一个问题,当它第一次出现时,滚动视图的帧设置不正确,因此,图像最初偏离中心,并且在动画完成后将显示为“跳转”到其正确的中

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

但是,我遇到了一个问题,当它第一次出现时,滚动视图的帧设置不正确,因此,图像最初偏离中心,并且在动画完成后将显示为“跳转”到其正确的中心位置,并且主线程恢复布局功能而不是动画。在最初的问题之后,一切都按预期进行


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

这个问题真的困扰了我,我尝试了viewDid*方法的每一种变体,并准备尝试一个自定义序列,这时我决定尝试此方法

在显示视图控制器上

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
    UIViewController *vc = [segue destinationViewController];
    [vc.view setNeedsLayout];
    [vc.view layoutIfNeeded];
}
注意,仅调用[vc.view layoutSubviews]不会执行上述操作,您需要使用setNeedsLayout,然后调用layoutifneed


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

这个问题真的困扰了我,我尝试了viewDid*方法的每一个变体,正要尝试一个自定义段,这时我决定尝试这个

在显示视图控制器上

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
    UIViewController *vc = [segue destinationViewController];
    [vc.view setNeedsLayout];
    [vc.view layoutIfNeeded];
}
注意,仅调用[vc.view layoutSubviews]不会执行上述操作,您需要使用setNeedsLayout,然后调用layoutifneed


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

您好。我遇到了同样的问题。你找到解决办法了吗?嗨。我遇到了同样的问题。你找到解决办法了吗?