陷入 iOS 自动布局泥潭

Posted

技术标签:

【中文标题】陷入 iOS 自动布局泥潭【英文标题】:Stuck in iOS AutoLayout Mire 【发布时间】:2014-04-21 01:30:52 【问题描述】:

我有一个 UIScrollView……在那个 UIScrollView 里面是一个 UIView(内容容器)……在那个内容容器里面是 3 个视图……

    标签 另一个 UIView (A) 另一个 UIView (B)

所有三个都是以编程方式创建的

2 和 3 都是从单独的 ReST 调用中加载的...所以在加载视图时,它们都是 30pt 高的微调器。

在其中一个或两个调用返回后,我想正确调整它们的大小(顶部将获得一个 320x320 的图像),底部将获得一个表格(大小目前尚未确定)...

我正在尝试实现此间距容器顶部 - 20pt - 标签 - 20pt - 内容 A - 20pt - 内容 B - 容器底部

我在内部使用以下 -(void) updateViewConstraints

    [_containerView addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|-20-[label]-20-[content A]-20-[content B]"
                                                                       options:0
                                                                       metrics:nil
                                                                         views:viewsDictionary]];

这是获取 A 内容的调用返回后的样子:

我真的已经准备好刺伤我的眼睛了......我不知道为什么这会如此困难。内容 B 的框架如下所示:Other Frame: 0, 150, 320, 30, Bounds: 0, 0, 320, 30

我最终想要做的是创建一个 UIScrollView,它允许我滚动视图以查看将显示在底部的图像和表格......我有 UIScrollView 和容器视图( _containerView = UIView) 作为 IB 中的 IBOutlets。

【问题讨论】:

自动布局和滚动视图太可怕了!我感觉到你的痛苦。您需要确保滚动视图中的所有项目都有大小,并以某种方式限制在滚动视图的所有边缘。或者,如果您不能给它们一个大小,请将它们限制在滚动视图超级视图上。例如在垂直滚动视图中,内部视图的左右边缘通常可以约束滚动视图超级视图。 视图 A 是否包含微调器,然后是图像视图,作为子视图?还是视图 A 是一个微调器,然后将其从视图层次结构中移除,然后将图像视图直接插入为滚动视图的子视图? 【参考方案1】:

你还没有提到你的表格视图的外观。如果表格视图只有一个部分,最简单的解决方案可能是给它三个部分。在第一部分放置一个单元格,包含标签。在第二部分放置一个单元格,包含“A”内容的微调器或图像视图。将“B”内容放在第三部分。

如果你不能这样做,这里有另一种方法。像这样设置视图层次结构的“静态”成员:

scrollView - UIScrollView
  scrollContentView - UIView
    label - UILabel
    aContainer - UIView
    bContainer - UIView

像这样设置垂直约束:

V:|-[scrollContentView]-|
V:|-[label]-[aContainer]-[bContainer]-|

插入 A 微调器作为 aContainer 的子视图,并像这样设置它的约束:

V:|[aSpinner]|

将 B 微调器作为 bContainer 的子视图插入,并以相同方式设置其约束:

V:|[bSpinner]|

当区域 A 的图像到达时,从其父视图中删除 aSpinner。这将消除aSpinneraContainer 之间的约束。将aImageView 添加为aContainer 的子视图并为其设置约束:

V:|[aImageView]|

当区域 B 的表数据到达时,从其父视图中删除 bSpinner。将bTableView 添加为bContainer 的子视图并为其设置约束:

V:|[bTableView]|

您需要弄清楚表格视图的高度,并为其设置约束。您可能会发现 this answer 很有用。

【讨论】:

【参考方案2】:

AutoLayout 据称是一个很好的布局引擎。但是我从来没有在现实世界中看到过这种情况,对我来说这只是一个令人头疼的问题。

我建议禁用 AutoLayout(您可以在 xib 文件的文档检查器中执行此操作)并使用旧的/经过验证的 springs 和 struts 系统。当您需要对 springs/struts 过于复杂的布局时,请在视图控制器中编写一些自定义代码来处理它。

【讨论】:

以上是关于陷入 iOS 自动布局泥潭的主要内容,如果未能解决你的问题,请参考以下文章

iOS scrollView自动布局技巧之二 - 纯代码自动布局

自动布局是拉伸图像,自动布局,ios

iOS 自动布局过程

iOS自动布局

读书笔记iOS-自动布局

iOS 7 自动布局与 iOS 8 自适应布局,有区别吗?