ios – Autolayout导致UI元素在运行时“捕捉”到位?

我有一个UIView,顶部是UI ImageView,下面是UILabel,下面是UIButton,还有一个UISegmentedControl,用于确定底部显示嵌入式UIview的内容(也可以选择不显示任何内容).

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

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

有谁知道为什么会这样?

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

解决方法

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

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

如果要在代码中调整UI,请确保它们在viewDidLoad或viewWillAppear中发生:这样它们就会在视图的初始布局传递之前发生(以及视图的动画在屏幕上).

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

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

    [self.view setNeedsLayout];
    [self.view layoutIfNeeded]; // forces an immediate layout pass
}

相关文章

当我们远离最新的 iOS 16 更新版本时,我们听到了困扰 Apple...
欧版/美版 特别说一下,美版选错了 可能会永久丧失4G,不过只...
一般在接外包的时候, 通常第三方需要安装你的app进行测...
前言为了让更多的人永远记住12月13日,各大厂都在这一天将应...