在自定义视图和视图控制器中使用 AutoLayout

Posted

技术标签:

【中文标题】在自定义视图和视图控制器中使用 AutoLayout【英文标题】:Using AutoLayout in Custom Views vs View Controllers 【发布时间】:2014-11-01 05:31:05 【问题描述】:

很长一段时间以来,我一直在使用旧的做事方式,通过在各个帧上设置原点和大小,并按照我想要的方式在屏幕上显示它们。现在我正在尝试使用 AutoLayout。但是我遇到了一些麻烦,我似乎无法找到确切的答案。

我习惯于主要使用代码来创建视图和视图控制器。因此,我已经熟悉如何创建自定义视图类,这些类可以根据自己的喜好组合多个视图。例如,我有一个自定义 Profile Pin 视图,它将 UIImageView 和 UILabel 组合到一个视图中,以表示 profileImage 和用户名。然后我在不同的地方使用这些自定义视图作为其他视图和视图控制器的一部分。

在我看来,自动布局适用于在屏幕方向更改时需要重新调整大小的视图,或者用于针对不同屏幕大小重新调整子视图。

我的问题是,我是否应该一丝不苟地为具有静态位置和大小的自定义视图使用自动布局?就像我描述的 Profile Pin 视图中的 UIImageVIew 和 UILabel 视图一样? UIImageView 和 UILabel 视图的位置不会改变,但 Profile Pin 视图(它们的父视图)的位置可能会改变。我应该对所有内容都使用自动布局吗?或者这不是 AutoLayout 的初衷?

【问题讨论】:

自动布局在您希望布局依赖于视图所在的超级视图的任何时候都非常有用。例如,如果您始终希望您的视图与父视图的边缘保持一定距离,或者您希望您的视图具有相对于父视图的边界。 【参考方案1】:

如果您的自定义视图具有静态内容,其子视图的大小和位置永远不会改变,那么您可以在内部随意使用手动框架。在这种情况下,自动布局没有太多好处。

应该做的是覆盖intrinsicContentSize 并返回正确的大小。这允许任何父视图使用自动布局来定位和了解自定义视图的大小。

许多 UIKit 组件都使用这种技术 - UISwitch 就是一个很好的例子。

【讨论】:

啊。这就是我希望听到的。谢谢!

以上是关于在自定义视图和视图控制器中使用 AutoLayout的主要内容,如果未能解决你的问题,请参考以下文章

在自定义视图控制器转换中抑制导航推送动画

在自定义容器视图中旋转时 AutoLayout 不会调整视图大小?

在自定义绘制的视图中动画大小变化的问题

在自定义视图中处理 UITapGestureRecognizer

为什么在自定义交叉溶解segue中视图控制器的主视图不对齐?

在自定义容器控制器中旋转后视图未调整大小