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

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

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

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

【问题讨论】:

  • 嗨。我遇到了同样的问题。你找到解决方案了吗?

标签: ios objective-c xcode xcode-storyboard


【解决方案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 进行更新。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-30
    • 1970-01-01
    • 2014-06-29
    • 1970-01-01
    • 2013-06-14
    相关资源
    最近更新 更多