自动布局导致UI元素在运行时“捕捉”到位?

6
我有一个包含UIImageView, UILabel, UIButtonUISegmentedControlUIView。它们依次排列,底部是嵌入式的UIview,可以选择不显示。
我在界面构建器中设置了所有约束,当我在storyboard中切换屏幕大小时,一切似乎都很好。然而,当我在设备上运行项目时,UIimage 在短暂变形后才“捕捉”到适合约束的尺寸。同样,标签在图像变形后消失了一小会儿,直到图像"捕捉"完成后才重新出现。"捕捉"完成后,一切都就位,没有问题。
这种"捕捉"现象在4英寸和3.5英寸的显示器上都出现过。我认为这很奇怪,因为我已经完美地为4英寸屏幕设计了UI。
有人知道这是什么原因吗? 编辑: 这里是在IB中的约束截图: Constraints

你在Xcode中是否有任何关于约束的警告?可能是因为故事板中的框架与约束不匹配。 - Andrew Sula
没有任何约束的警告。我使用了他们建议的约束,在界面构建器中一切看起来都很好。 - p0ny
你能在IB中发布你的约束条件截图吗? - Acey
你用的是哪个版本的Xcode? - Andrew Sula
我们曾经遇到过类似的问题,是由于Storyboard中的一些“margin”值引起的。请查看此处https://dev59.com/2ITba4cB1Zd3GeqP64D5。 - longi
3个回答

6
这可能是由于您在代码中的视图控制器中对UI元素(或约束)进行了调整。例如,如果您以编程方式将不同的UIImage设置到UIImageView中,并且此代码发生在视图生命周期过晚的时间(例如,在viewDidAppear之后),此时布局已经计算出视图位置和大小,则会看到视图因新的内在内容大小而采用新位置而出现明显的快照。
这可能是由其他调整引起的,例如在代码中将本地化字符串注入UILabel,这将导致标签具有较小或较大的内在内容大小,进而影响基于您的约束的布局。
如果您在代码中对UI进行调整,请确保它们在viewDidLoadviewWillAppear:中发生,以便它们在视图的初始布局传递(以及视图在屏幕上的动画)之前发生。
如果仍然存在问题,您可以尝试在viewWillAppear:结束时强制立即对视图控制器的视图进行布局传递,方法如下:
- (void)viewWillAppear:(BOOL)animated {
    [super viewWillAppear:animated];

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

2

我明白了,您已经为选择器应用了约束以使其与分段控件一起调整。因此,当应用程序在4英寸屏幕上运行时,选择器会自动适合,但是对于3.5英寸的屏幕,选择器始终从屏幕底部开始,并且选择器将向上推动分段控件,因此分段控件将自动推动其余控件。 移除选择器和分段控件的约束。


2

UI元素之间的间距可能是问题所在。特别是在使用选择器时。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接