具有自动布局和设备旋转的 UIScrollView

Posted

技术标签:

【中文标题】具有自动布局和设备旋转的 UIScrollView【英文标题】:UIScrollView with Auto Layout and Device Rotation 【发布时间】:2014-03-20 19:54:03 【问题描述】:

我正在尝试布置一个 UIScrollView 以包含多个内容 UIView 对象(几个 UIImageView 对象、一个 MKMapView 对象、UILabel 对象等...)。

我想要在左上角用“大”UIImageView 和右上角的MKMapView 布置项目。我希望它们的大小相同,通常与屏幕的左右边缘(标准 20 点)、视图顶部(标准 20 点)间隔开,并且通常在每个屏幕的中心间隔开其他(标准8分)。我希望它们是方形的,所以它们的高度由它们计算出的宽度决定。

然后,我想放置一排布局相似的UIImageView 对象,它们通常与顶部“行”、视图的左侧和右侧以及彼此隔开。我还希望这些对象是方形的,从宽度计算它们的高度。

在下面,我想要一些 UILabel 对象(标题标签,然后是更长的描述)。

这是我的愿望的粗略布局:

人像模式

|------------------------------|
|                              |
|  |----------|  |----------|  |
|  |          |  |          |  |
|  |          |  |          |  |
|  |          |  |          |  |
|  |----------|  |----------|  |
|                              |
|  |------| |------| |------|  |
|  |      | |      | |      |  |
|  |      | |      | |      |  |
|  |------| |------| |------|  |
|                              |
|  Title Label Here            |
|                              |
|  Description here..........  |
|  Description here..........  |
|  Description here..........  |
|  Description here..........  |
|                              |
|------------------------------|

横向模式(标题和描述标签假定在屏幕外)

|----------------------------------------------|
|                                              |
|  |------------------|  |------------------|  |
|  |                  |  |                  |  |
|  |                  |  |                  |  |
|  |                  |  |                  |  |
|  |                  |  |                  |  |
|  |                  |  |                  |  |
|  |                  |  |                  |  |
|  |                  |  |                  |  |
|  |------------------|  |------------------|  |
|                                              |
|  |-----------| |-----------|  |-----------|  |
|  |           | |           |  |           |  |
|  |           | |           |  |           |  |
|  |           | |           |  |           |  |
|  |           | |           |  |           |  |
|  |-----------| |-----------|  |-----------|  |
|                                              |
|----------------------------------------------|

很明显,很多标题/描述内容会比屏幕更大,因此我试图将所有这些都放在UIScrollView 中。

此外,我希望此布局能够适应设备旋转。

我似乎无法弄清楚如何使用自动布局来做到这一点。

使用弹簧和支柱,这似乎是一个相当简单的过程。

使用自动布局,我不断收到“缺少约束”和“放错视图”的错误/警告。

我已阅读 Apple 文档here。

我已阅读 this 博文

听从他们的建议对我来说真的没有意义(或者至少,当我尝试时,它不起作用)。

【问题讨论】:

您是否尝试在内部视图和UIScrollView 之间直接添加约束。由于多种原因,这不起作用。在UIScrollView 内放置东西的最接近方法是使用与内容大小相同的“容器视图”。将其放置在 (0,0) 并将您的内容放入此容器中。您现在可以相对于容器视图布置内容。 此外,您尝试实现的布局似乎比标准 UIScrollView 更适合 UITableView 或 UICollectionView。 【参考方案1】:

每个视图必须至少有 4 个约束,以便 Autolayout 计算 4 条边。 从左上角的图像开始。为顶部边缘设置约束:将其固定到其 superView 并使用默认值(只需删除 InterfaceBuilder 中的数值)。然后对左边缘做同样的事情。 现在对右上角和右边缘的右上角地图视图执行相同的操作(将它们固定到 superView)。 然后设置从左图像的右边缘到地图的左边缘的水平约束。再次删除数值,自动布局将使用默认值。 最后为图像设置纵横比 1:1 约束,为地图设置相同的约束。 现在两个顶视图已经完全定义好了。

继续左小图,将其左边缘固定到超级视图(默认),将上边缘固定到大图的底部(默认)。现在将中间小图像的上边缘与左图像对齐。将右侧小图像的上边缘与中间小图像对齐。将左图像的右边缘固定到中间图像的左边缘,然后对右+中间图像执行相同操作。将右图像的右边缘固定到超级视图。现在所有图像都是顶部对齐并水平固定到彼此和超级视图。同样,您需要为至少一个图像添加纵横比 1:1 约束。但是您可以将其他两个图像的底部边缘与第一个图像对齐,而不是每个图像都有自己的纵横比约束。 现在三个小图像已经完全定义好了。

最后将标签固定到超级视图的左边缘,每个顶部边缘都固定在其顶部视图的底部。由于文本标签的大小由文本(宽度)和使用的字体(高度)决定,因此标签只需要两个约束 (x,y)。

你已经完成了。

【讨论】:

以上是关于具有自动布局和设备旋转的 UIScrollView的主要内容,如果未能解决你的问题,请参考以下文章

自动布局正在改变 UIScrollView 的 contentOffset 旋转

UIScrollView 具有自动布局的错误 contentSize

如果自动布局打开,防止 UIScrollView 水平滚动

具有动态视图数量和自动布局 iOS6 的 UIScrollView

通过 UIScrollView 使用代码中的自动布局

具有自动布局的 UIScrollView 中的动态大小的 UITableView