iOS运行时帧大小不正确

时间:2018-08-30 01:22:33

标签: ios swift

我在控制器的根视图中有一个UIImageView,并将其设置为屏幕宽度的90%,并赋予了宽高比作为设置尺寸的约束。

在代码中,我试图在运行时针对UIImageView的大小做一些事情,但是当我得到UIImageView的frame.size.heightframe.size.width时,它们显然是错误的,也是这样小。

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

2 个答案:

答案 0 :(得分:2)

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

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

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

如果图像视图是视图控制器视图的直接子视图,则其框架在viewDidLayoutSubviews中是最新的。

如果图像视图是更远的后代,则在视图控制器中没有可以重写的方法,该方法将在更新图像视图的帧之后但在屏幕上显示图像视图之前调用。在这种情况下,有两个选择:

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

  2. 创建一个隐藏的UIView,它是视图控制器顶级视图的直接子视图。使用约束使该隐藏视图的框架与图像视图的框架完全匹配。隐藏视图参与布局,因此,调用viewDidLayoutSubviews时,该隐藏视图的框架是最新的,并且最终与图像视图的框架相同(但隐藏视图的框架位于顶层视图的几何形状,可能与图像视图的超级视图的几何形状不同。

答案 1 :(得分:0)

如果尝试在viewDidload()中获取宽度或高度,则高度和宽度会出错,因为在viewDidload中方法控制器未完全加载,因此正在加载,因此您得到的尺寸不正确

如果您需要viewDidload()方法中的高度和宽度,以便可以使用

 DispatchQueue.main.asyncAfter(deadline: .now()+0.1) {
        //get height or width
    }