Ios 自动布局:UIView中的UIView具有不正确的帧

Ios 自动布局:UIView中的UIView具有不正确的帧,ios,cocoa-touch,uiview,autolayout,uistoryboard,Ios,Cocoa Touch,Uiview,Autolayout,Uistoryboard,我正在故事板中使用AutoLayout,一切似乎都很顺利。但是,当我将一个UIView放在另一个UIView中并将所有约束应用于容器及其子对象时,我注意到viewdilayoutsubview:中的框架不正确。它不是我期望在给定约束条件下计算的帧,而是一个令人厌恶的大帧(尽管在正确的原点)。例如,我得到的不是{26,10},{444,10}的帧,而是类似于{0,0},{320,568}的帧 奇怪的是,仅当我将子UIView放置在另一个UIView中时,它才会发生这种情况,该UIView相对于它的

我正在故事板中使用AutoLayout,一切似乎都很顺利。但是,当我将一个UIView放在另一个UIView中并将所有约束应用于容器及其子对象时,我注意到
viewdilayoutsubview:
中的框架不正确。它不是我期望在给定约束条件下计算的帧,而是一个令人厌恶的大帧(尽管在正确的原点)。例如,我得到的不是{26,10},{444,10}的帧,而是类似于{0,0},{320,568}的帧

奇怪的是,仅当我将子UIView放置在另一个UIView中时,它才会发生这种情况,该UIView相对于它的超级视图(视图控制器的视图)应用了一些约束。由于我的印象是,我可以期望根据我在方法
viewdilayoutsubviews:
中的约束适当地布置我的视图,因此我不明白为什么会发生这种情况

我是否做出了错误的假设?如果有人能帮我指出正确的方向,我将不胜感激。谢谢


注意:如果我在
viewdide:
中进行了正确的帧相关设置,则此问题已完全修复,但这对我来说是一种不太令人满意的解决方法。

对边界的自动布局更改不一定在
-viewdidelayoutsubviews
中完成。内容如下:

基于约束的布局是一个迭代过程。布局通行证可以 基于以前的布局解决方案对约束进行更改, 这会再次触发在另一个布局之后更新约束 通过

-viewdilayoutsubviews
的文档:

但是,调用此方法并不表示已调整视图子视图的各个布局

因此,子视图中基于布局和约束的迭代可以继续调整其帧,但如果ViewController的视图边界不变,则不会调用其
-viewWillLayoutSubviews

既然你说你的设置是“帧相关的”,你有几个选择

一,。在
中进行设置-视图将显示
。比
-viewdideappear
更好,而且由于您确实需要在所有布局完成后但在其出现在屏幕上之前完成所有工作,因此这是该方法存在的合理原因。如果相关,您可以尝试调用
-isMovingToParentViewController
如中所述

编辑:
-视图将在视图添加到视图层次结构之前被调用,因此布局可能无法完成。对不起大家,感谢Swift用户界面,我们正在从过程性布局转向声明性布局,这就是为什么


  • 在视图上调用
    -layoutifneedd
    ,以便在需要的位置获得正确的值。因为这样做的布局工作是昂贵的,而且如果在自己的布局过程中触发,可能会导致重复工作,甚至是无限循环。但是,如果需要将某些值与自动布局同步,以便可以使用它们,那么它非常有用

  • 若这不起作用,请告诉我们,这可能和约束本身的性质或其他因素有关。自动布局迭代可能很难同步。祝你好运。

    请检查以下内容:-@Er.shreyanshah谢谢你的回复。然而,我实际上使用的是自动布局,所以很遗憾,禁用它对我不起作用。我提到我在这一点上依赖于一个正确的框架,这仅仅是因为我正在这个视图中绘制一些简单的CAShapeLayer图形,其层框架要求superview bounds属性正确。非常感谢您的帮助!我不知道关于viewWillLayoutSubviews。由于某些原因,ViewWillAppeal从未被调用。我将更深入地研究这一点;我怀疑这与我的显示视图控制器嵌入到导航控制器(它本身是从父视图控制器以模式显示的)中有关。再次感谢您提供此信息
    layoutIfNeeded
    在我的案例中有所帮助出于某种原因,SKView在
    viewwillbeen
    中仍然有错误的帧,它的大小只有在
    viewdide
    中才变得正确。可能是SKView的一个细节。只是一个便条。嗨@Vitalii你是对的,这篇文章已经错了5年了。我现在注意到了这一点,因为人们仍然在投票支持这个答案[悲伤表情],幸亏有了Swift UI,我们正在远离程序布局,这就是为什么。