首页 > 解决方案 > iOS 在运行时不正确的帧大小

问题描述

我有UIImageView一个控制器的根视图,我将它设置为屏幕宽度的 90%,并给它一个纵横比作为设置尺寸的约束。

在代码中,我试图在运行时对 UIImageView 的大小做一些事情,但是当我得到 UIImageView 的frame.size.heightorframe.size.width时,它们显然是错误的而且太小了。

起初我在访问大小,viewDidLoad()之后我发现很多帖子建议在viewWillLayoutSubviews()viewDidLayoutSubviews()viewWillAppear()不幸的是,我已经尝试了所有这些,但这些上下文似乎都没有提供正确的价值。我怀疑它可能与自动布局有关,但我不太确定如何解决这个问题。任何关于为什么会这样的见解将不胜感激

标签: iosswift

解决方案


viewDidLoad为时过早。此时,视图具有它们在情节提要中给出的框架。同上viewWillAppear

viewWillLayoutSubviews中,视图控制器的顶级视图具有正确的框架,但其后代没有。

viewDidLayoutSubviews中,视图控制器的直接子视图具有正确的帧,但更远的后代(“孙子”等)没有。

如果图像视图是视图控制器视图的直接子视图,那么它的框架在viewDidLayoutSubviews.

如果图像视图是一个更远的后代,那么您无法在视图控制器中覆盖任何方法,该方法将在图像视图的框架更新后但在图像视图在屏幕上可见之前调用。在这种情况下,有两个选项:

  1. 创建一个自定义子类UIView作为图像视图的父视图。当 superviewlayoutSubviews运行时,在它调用 之后super.layoutSubviews,图像视图的框架是最新的。

  2. 创建一个隐藏UIView的,它是视图控制器顶级视图的直接子视图。使用约束使这个隐藏视图的框架与图像视图的框架完全匹配。隐藏视图参与布局,所以当viewDidLayoutSubviews被调用时,这个隐藏视图的框架是最新的,并且与图像视图的框架最终将是相同的(除了隐藏视图的框架在顶级视图的几何中,这可能不同于图像视图的超级视图的几何形状)。


推荐阅读