【问题标题】:AutoLayout: UIView within UIView has incorrect frame自动布局:UIView 中的 UIView 有不正确的框架
【发布时间】:2015-04-20 12:34:52
【问题描述】:

我正在 Storyboard 中使用 AutoLayout,一切似乎都很顺利。但是,当我将一个 UIView 放入另一个 UIView 并对容器及其子级应用我想要的所有约束时,我注意到 viewDidLayoutSubviews: 中的框架不正确。鉴于我的限制,它不是我期望计算的框架,而是一些令人作呕的大框架(尽管在正确的原点)。例如,我得到的不是 {{26, 10}, {444, 10}} 的框架,而是 {{0, 0}, {320, 568}}时间>。

奇怪的是,当我将子 UIView 置于另一个 UIView 中时,这种情况发生,该 UIView 对其父视图(即视图控制器的视图)应用了一些约束。由于我的印象是,我可以期望我的视图会根据我在方法 viewDidLayoutSubviews: 中的约束得到适当的布局,所以我对为什么会发生这种情况感到困惑。

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

注意:如果我在 viewDidAppear: 中进行依赖于正确帧的设置,这个问题将完全解决,但这对我来说是一个有点不满意的解决方法。

【问题讨论】:

  • @Er.ShreyanshShah 感谢您的回复。但是,我实际上正在使用 AutoLayout,因此很遗憾禁用它对我不起作用。我提到我当时依赖于一个正确的框架,这仅仅是因为我在这个视图中做一些简单的 CAShapeLayer 绘图,其层框架需要超级视图边界属性正确

标签: ios cocoa-touch uiview autolayout uistoryboard


【解决方案1】:

对边界的自动布局更改不一定在-viewDidLayoutSubviews 中完成。如"Advance Auto Layout Toolbox"

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

-viewDidLayoutSubviewsnotes with emphasis in the original 的文档:

然而,这个被调用的方法并不表明视图的子视图的个别布局已经被调整。

因此子视图中的布局和基于约束的迭代可以继续调整它们的框架,但是如果 ViewController 的视图边界没有改变,它的-viewWillLayoutSubviews 将不会被调用。

既然您说您的设置是“依赖于框架”的,那么您有几个选择。

1。在-viewWillAppear 中进行设置。比-viewDidAppear 更好,因为如果完成了所有布局,但在它出现在屏幕上之前,你真的需要完成所有事情,这是该方法存在的正当理由。如果相关,您可以尝试致电-isMovingToParentViewControllerDetermining Why A View's Appearance Changed 中所述。

编辑:-viewWillAppear 在视图添加到视图层次结构之前被调用,因此布局可能不会完成。对不起大家,谢天谢地,有了 Swift UI,我们正在从程序布局转向声明式布局,这就是原因。


  1. 调用-layoutIfNeeded 获取所需的正确值的视图。因为这样做布局工作很昂贵,并且如果在其自己的布局过程中触发,它可能导致重复工作甚至无限循环。但如果需要将某些值与 Auto Layout 同步以便使用它们时,它会很有用。

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

【讨论】:

  • 非常感谢您的帮助!我不知道 viewWillLayoutSubviews。出于某种原因, viewWillAppear 永远不会被调用。我会更深入地研究一下;我怀疑这与我的呈现视图控制器嵌入在导航控制器中有关(它本身是从父视图控制器模态呈现的)。再次感谢您提供此信息!
  • layoutIfNeeded 帮助了我
  • 由于某种原因,SKView 在viewWillAppear 中仍然有错误的框架,它的大小仅在viewDidAppear 中变得正确。可能是 SKView 的一个细节。只是一个注释。
  • 嗨@Vitalii你是对的,这个帖子已经错了5年。我现在才注意到这一点,因为人们仍在支持这个答案 [悲伤的表情符号] 谢天谢地,有了 Swift UI,我们正在远离程序布局,这就是原因。
猜你喜欢
  • 2018-02-24
  • 1970-01-01
  • 1970-01-01
  • 2015-04-12
  • 1970-01-01
  • 1970-01-01
  • 2013-11-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多