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!)。
我尝试了几种方法,发现了以下内容:
- 如果我针对单元格的前导(左)、顶部和底部边缘设置标签约束,它会正确显示。
- 如果我在 Interface Builder 中将标签放在单元格的最右边,没有任何约束,它会显示我放置它的位置(当然,在旋转时到横向,它将与左边缘保持固定距离,而不是坚持到右边缘。
- 如果我将标签放在任何地方,并向容器的后(右)边缘添加约束,则显示或不显示取决于约束指定的距离。也就是说,约束似乎停留在单元格的原始右边缘 +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.固定高和宽
首先从这三个标签中删除所有约束,然后按照此步骤逐一添加约束,如下所述。
- 对于左侧标签 select,您的标签转到固定菜单并为其添加这 5 个约束。:
- 对于中心标签,添加这两个约束,使其始终出现在中心:
- 对于右侧标签添加这 5 个约束:
结果将适用于所有屏幕:
HERE 是示例项目。
我已经对 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!)。
我尝试了几种方法,发现了以下内容:
- 如果我针对单元格的前导(左)、顶部和底部边缘设置标签约束,它会正确显示。
- 如果我在 Interface Builder 中将标签放在单元格的最右边,没有任何约束,它会显示我放置它的位置(当然,在旋转时到横向,它将与左边缘保持固定距离,而不是坚持到右边缘。
- 如果我将标签放在任何地方,并向容器的后(右)边缘添加约束,则显示或不显示取决于约束指定的距离。也就是说,约束似乎停留在单元格的原始右边缘 +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.固定高和宽
首先从这三个标签中删除所有约束,然后按照此步骤逐一添加约束,如下所述。
- 对于左侧标签 select,您的标签转到固定菜单并为其添加这 5 个约束。:
- 对于中心标签,添加这两个约束,使其始终出现在中心:
- 对于右侧标签添加这 5 个约束:
结果将适用于所有屏幕:
HERE 是示例项目。