为啥需要覆盖 layoutSubviews

Posted

技术标签:

【中文标题】为啥需要覆盖 layoutSubviews【英文标题】:Why need override layoutSubviews为什么需要覆盖 layoutSubviews 【发布时间】:2015-03-06 06:48:02 【问题描述】:

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

    父视图已调整大小 设备旋转 还有吗?

如果不需要处理,对于UITableView,我们可以通过创建一个自定义的UIView来为section header创建一个header view。最简单的方法是通过initWithFrame: 创建UIView,然后就不需要重新布局了。

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

不使用的原因:

    KISS(保持简单和愚蠢) 无需重新布局 滚动时重新布局有成本

我的问题是为这个案例获得更多建议。谢谢。

【问题讨论】:

保持简单,愚蠢。不简单愚蠢:) 【参考方案1】:

您通常不需要覆盖layoutSubviews。基本上只有两个原因:

您的自定义 UIView 子类包含您希望使用手动布局重新排列的子视图 您的自定义 UIView 子类需要知道它的大小何时因其他原因而发生变化,例如缩小字体大小或进行一些手动绘图

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

【讨论】:

我仍然无法弄清楚如何正确使用 layoutSubviews 中的“手动布局”。你总是使用像'layoutDone'这样的标志还是每次调用方法时都计算它?如何防止约束被多次添加到视图中? @petar 不,永远不要使用标志,也不要在那里添加约束。这个方法必须是幂等的。您只需在该方法中设置框架。 因此,如果我有一个动态更新的视图(例如,我想将子视图添加到特定位置,或者重新排列当前添加的子视图等) - 这应该发生在哪里?假设我初始化了一个自定义视图,其中包含一组模型对象,当视图添加到超级视图时我希望显示这些对象。 (最初视图不会知道它的正确大小并且模型对象的布局不能正确发生) - 你认为这应该发生在哪里?非常感谢 你应该发布一个新问题

以上是关于为啥需要覆盖 layoutSubviews的主要内容,如果未能解决你的问题,请参考以下文章

为啥我需要覆盖 Java 中的 equals 和 hashCode 方法?

为啥我需要覆盖 Java 中的 equals 和 hashCode 方法?

为啥我需要覆盖 C# 中的 .Equals 和 GetHashCode [重复]

为啥我的excel打字总是被下列覆盖,需要拉长列宽

为啥在 C++ 中覆盖是可选的?

为啥从我的python脚本写入文件被覆盖[重复]