为什么需要重写layoutSubviews方法?

4
在问题“When does layoutSubviews get called?”中列举了几种情况:

  1. 父视图被调整大小
  2. 设备旋转
  3. 还有其他情况吗?

如果没有处理UITableView的要求,我们可以通过创建一个自定义的UIView来为部分标题创建一个标题视图。最简单的方法是使用initWithFrame:创建UIView,然后不需要再进行布局。

因此,在我看来,我们不需要覆盖layoutSubviews等。但是也有一些人坚持要覆盖它。

不使用它的原因:

  1. KISS(保持简单和愚蠢)
  2. 没有重新布局的要求
  3. 滚动时重新布局会产生成本

我的问题在这里是针对此案例的更多建议。谢谢。


1
保持简单,傻瓜式的简单,而不是简单和愚蠢 :) - Niklas Berglund
1个回答

4

通常情况下,您不需要覆盖layoutSubviews方法。基本上只有两个原因:

  • 您的自定义UIView子类具有您想要使用手动布局重新排列的子视图。
  • 您的自定义UIView子类需要知道其大小何时更改,例如缩小字体大小或进行一些手动绘图等其他原因。

一般来说,您不需要覆盖此方法。大多数布局是由视图控制器在适当的时间设置视图的frame或使用自动布局来完成的。


我仍然无法正确使用layoutSubviews中的“手动布局”。您是否总是使用像“layoutDone”这样的标志,还是每次调用该方法时都要重新计算?您如何防止将约束多次添加到视图中? - Petar
1
@petar 不,永远不要使用标志(flag),也不要在那里添加约束(constraints)。这个方法必须是幂等的(indempotent)。你只需要在那个方法中设置帧(frames)即可。 - Aaron Brager
如果我有一个动态更新的视图(例如,我想在特定位置添加子视图,或重新排列当前添加的子视图等),那么应该在哪里进行?假设我初始化了一个自定义视图,其中包含一组模型对象,当将视图添加到父视图时,我希望这些对象被显示出来。(最初,视图不知道其正确的大小,模型对象的布局无法正确进行)- 你认为这应该发生在哪里?非常感谢。 - Petar
你应该发布一个新问题。 - Aaron Brager

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接