Autolayout导致UI元素在运行时"捕捉"到位?

p0n*_*0ny 6 objective-c interface-builder ios uistoryboard autolayout

我有UIView一个UIImageView在最顶部,UILabel下面吧,UIButton下面的是,和UISegmentedControl它决定了决定了嵌入UIview在底部(也可以选择不显示任何在所有)来显示.

我遇到了在界面构建器中设置了所有约束的问题,当我在故事板中切换屏幕尺寸时,一切似乎都很好.但是,当我实际在设备上运行项目或模拟时,UIimage顶部会在"捕捉"到适合约束的大小之前被短暂拉伸.此外,似乎标签在短时间内消失,并在图像捕捉到大小后重新出现.发生"快照"后,一切都已就绪,没有任何问题.

在4英寸和3.5英寸显示器上进行测试时都会发生这种卡扣.我发现这很奇怪,因为我已经为4英寸屏幕设计了完美的用户界面.

有谁知道为什么会这样?

编辑 这里是IB中约束的样子.

约束

smi*_*org 6

这可能是由于您可能在代码中从视图控制器对UI元素(或约束)进行的调整.例如,如果您以编程方式将不同的UIImage设置到UIImageView中,并且在viewDidAppear布局传递已经计算了视图位置和大小之后,此视图在视图生命周期(例如,in )中发生得太晚,那么您将看到一个可见的捕捉视图根据图像视图的新内在内容大小占据新位置.

这可能是由其他调整引起的,例如在代码中将本地化字符串注入UILabel,这会导致标签具有更小或更大的内在内容大小,这反过来会影响基于约束的布局.

如果要在代码中对UI进行调整,请确保它们在视图的初始布局传递(以及屏幕上的视图动画)之前发生viewDidLoadviewWillAppear:发生.

如果您仍然遇到问题,可以尝试viewWillAppear:通过执行以下操作,在视图控制器的视图结尾处显式强制立即执行布局传递:

- (void)viewWillAppear:(BOOL)animated {
    [super viewWillAppear:animated];

    [self.view setNeedsLayout];
    [self.view layoutIfNeeded]; // forces an immediate layout pass
}
Run Code Online (Sandbox Code Playgroud)