为啥需要覆盖 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 方法?