【问题标题】:Difference between layoutSubviews() and viewWillLayoutSubviews()layoutSubviews() 和 viewWillLayoutSubviews() 的区别
【发布时间】:2016-09-21 01:18:05
【问题描述】:

我知道layoutSubviews()UIView 中的一个方法,viewWillLayoutSubviews()UIViewController 中的一个方法,它们都用于在边界/框架发生变化时调整子视图的位置,但我不完全确定它们之间的区别以及何时使用它们。有人可以启发我吗?

【问题讨论】:

  • 它们不是“都用于”任何东西。它们是让您知道正在发生的事情的消息。是否回复该信息取决于您。

标签: ios swift uiview uiviewcontroller


【解决方案1】:

没有有效的区别。一个(layoutSubviews)是运行时发送给视图的消息,另一个(viewWillLayoutSubviews)是运行时发送给视图控制器的消息。给视图控制器的消息告诉视图控制器它的视图即将收到视图消息!就这样。他们一起去。

【讨论】:

    【解决方案2】:

    viewWillLayoutSubviews 在视图控制器的视图边界更改时调用(通常发生在视图加载或方向更改时,或者如果它是子视图控制器,并且其视图已被父视图控制器更改),但在它的子视图边界之前或位置变化。您可以覆盖此方法以在视图布局之前对子视图的边界或位置进行一些更改。

    layoutSubviews,来自苹果的documentation

    仅当子视图的自动调整大小和基于约束的行为不能提供您想要的行为时,您才应该覆盖此方法

    当布局更新发生时,通过显式更改视图的边界或在视图上调用 setNeedsLayoutlayoutIfNeeded 来强制更新布局,将调用此方法。请记住,它会被操作系统自动调用,千万不要直接调用。您很少需要覆盖此方法,因为通常自动调整大小或约束会为您完成这项工作。

    【讨论】:

      【解决方案3】:

      当您更改 UIView 内的任何约束值并且多个元素受约束更改影响时,您可以调用 UIView 的layoutSubviews()。当您通过在运行时获取约束的出口来更改约束来执行某些任务时,您可以调用它。但这不是最佳做法。我建议打电话给layoutIfNeeded() 而不是这个layoutSubviews()

      当您想要在任何元素在视图控制器中改变其大小或位置之前执行某些任务时,您需要使用viewWillLayoutSubviews() 函数。

      当您要制作应用程序时,这两个功能很少在最坏的情况下使用。这是按照我的理解。谢谢。

      【讨论】:

      • 来自苹果的Documentation,你不应该直接调用layoutSubviews()
      • 太好了,这意味着我的想法是正确的。我以前没见过,但我认为不应该调用这个函数。
      • “你需要打电话”不。永远不要打电话。
      • 如果我不应该直接调用 layoutSubviews(),我还能继承 UIView,覆盖 layoutSubviews() 的超类实现并从子类 layoutSubviews() 调用 super.layoutSubviews() 吗?这样做是否合法?可以做点什么吗?
      • 如果你想在子类中执行一些与你正在使用 UIView 更新框架的布局相关的事情,那么你可以像你说的那样使用。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-06-20
      • 2013-08-07
      相关资源
      最近更新 更多