我已经对 UITableViewCell
进行了子类化(使用 xib),并且我注意到当我使用自动布局/约束时,我放置在 Interface Builder 中的标签在运行时无法正确显示。
首先,我根据单元格的内容 View 将三个标签分别左对齐、居中对齐和右对齐。
当我运行我的应用程序时,最左边的标签在左边,中心标签在右边,最右边的标签无处可见。
我在我的 -tableView:cellForRowAtIndexPath:
(在托管表格 View 的 UIViewController
子类中)记录了单元格内容 View 的框架,我得到了这个值:
(0.0, 0.0, 600.0, 43.5)
据报道宽度为 600,但我假设这是通用的“任何设备” Storyboard大小(尽管奇怪的是,该单元格来自一个单独的 xib,只有单元格 View ,而不是 Storyboard或 xib View Controller 的),它会在传递给它后由 TableView 相应地调整大小(作为旁注,注意高度是 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)
相反,如果我删除尾随约束并将其替换为内容 View 左边缘的前导约束,并将标签留在 Interface Builder 中的相同位置,则上述日志给出:
Label frame: (271.0, 11.0, 41.0, 21.0)
Label frame: (278.0, 11.0, 41.0, 21.0)
那么,表格 View 单元格的尾随约束是怎么回事?如何将标签对齐到右边缘??
编辑:我在单元格的 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 点宽,即使在放入表格 View 之后也是如此!
编辑 2: 所以,我发现了问题,显然它在其他地方:表格本身被卡在 600 点宽处,因为我没有在 Interface Builder 中将它限制到 View Controller 的 View 边缘。
傻我!
一旦我将 TableView 的四个边缘固定到其父 View 的四个边缘,问题就会自行纠正。
第一次在 Interface Builder 中使用 TableView ...
最佳答案
首先从这三个标签中删除所有约束,然后按照此步骤逐一添加约束,如下所述。
- 对于左标签,选择您的标签,转到固定菜单并为其添加这 5 个约束。:
- 对于中心标签,添加这两个约束,使其始终出现在中心:
- 为右标签添加这 5 个约束:
结果将适用于所有屏幕:
HERE是示例项目。
关于ios - UITableViewCell 无法将标签约束到右边缘,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30882795/