UITableViewCell 无法将标签约束到右边缘

UITableViewCell Can Not Constrain Label to Right Edge

我已经对 UITableViewCell 进行了子类化(使用 xib),并且我注意到当我使用 autolayout/constraints 时,我放置在 Interface Builder 中的标签在 [=90= 处没有正确显示]时间。

首先,我根据单元格的内容视图将三个标签左对齐、居中对齐和右对齐。

当我运行我的应用程序时,最左边的标签在左边,中间的标签在右边,最右边的标签是无处可见。

我在我的 -tableView:cellForRowAtIndexPath: 中记录了单元格内容视图的框架(在托管 table 视图的 UIViewController 子类中),我得到了这个值:

(0.0, 0.0, 600.0, 43.5)

据报道宽度为 600,但我认为这是通用的 'any device' 故事板大小(尽管奇怪的是,该单元格来自一个单独的 xib,只有单元格视图,而不是故事板或视图控制器的 xib),并且在传递给它后将由 table 视图相应地调整大小(作为旁注,请注意高度为 43.5,不是 44!)。

我尝试了几种方法,发现了以下内容:

  1. 如果我针对单元格的前导(左)、顶部和底部边缘设置标签约束,它会正确显示。
  2. 如果我在 Interface Builder 中将标签放在单元格的最右边,没有任何约束,它会显示我放置它的位置(当然,在旋转时到横向,它将与左边缘保持固定距离,而不是坚持到右边缘。
  3. 如果我将标签放在任何地方,并向容器的后(右)边缘添加约束,则显示或不显示取决于约束指定的距离。也就是说,约束似乎停留在单元格的原始右边缘 +600。如果我将它放在最左边的边缘附近,但将约束拖向后缘,它会出现在右边的某个地方。

我尝试从单元格代码中记录标签的框架,如下所示:

override func layoutSubviews()
{
    super.layoutSubviews()

    // (...label should be at the right position now?)

    println("Label frame: \(rightLabel.frame)") 
}

在 Interface Builder 上,标签为 41 x 21,位于 (271, 11)。 上面的日志被一行调用两次,并给出:

Label frame: (271.0, 11.0, 41.0, 21.0)
Label frame: (544.0, 11.0, 41.0, 21.0)

相反,如果我删除尾随约束并将其替换为内容视图左边缘的前导约束,并将标签留在 Interface Builder 中的相同位置,则以上日志给出:

Label frame: (271.0, 11.0, 41.0, 21.0)
Label frame: (278.0, 11.0, 41.0, 21.0)

那么,table 视图单元格的尾随约束是怎么回事?如何将标签对齐到右边缘?

编辑: 我在单元格的 layoutSubviews() 方法中添加了以下行:

println("Own frame: \(self.frame)")

我得到这个输出:

Label frame: (271.0, 11.0, 41.0, 21.0)
Own frame: (0.0, 0.0, 600.0, 44.0)
Label frame: (544.0, 11.0, 41.0, 21.0)
Own frame: (0.0, 0.0, 600.0, 44.0)

因此,单元格保持 600 点宽,即使在放入 table 视图后也是如此!

编辑 2: 所以,我发现了问题,显然它在其他地方:table 本身被卡在 600 点宽, 因为我没有在 Interface Builder[=68] 中将它限制到视图控制器的视图边缘=].

傻我!

将 table 视图的四个边固定到其父视图的四个边后,问题自行纠正。

第一次在 Interface Builder 中使用 table 视图...

将此约束应用于您的标签

左标签的约束 1. 导致superview 2.置顶superview 3.固定高和宽

中心标签的约束 1.水平到superview 2.置顶superview 3.固定高和宽

右标签的约束 1.尾随监督 2.置顶superview 3.固定高和宽

首先从这三个标签中删除所有约束,然后按照此步骤逐一添加约束,如下所述。

  1. 对于左侧标签 select,您的标签转到固定菜单并为其添加这 5 个约束。:

  1. 对于中心标签,添加这两个约束,使其始终出现在中心:

  1. 对于右侧标签添加这 5 个约束:

结果将适用于所有屏幕:

HERE 是示例项目。