我已经将UITableViewCell
(带有xib)子类化了,我注意到当我使用autolayout / constraints时,我在Interface Builder中放置的标签在运行时无法正确显示。
首先,我将三个标签相对于单元格的内容视图左右,中间和右边对齐。
当我运行我的应用时,最左侧的标签位于左侧,中间标签位于右侧,最右侧的标签无处可见。
我在我的-tableView:cellForRowAtIndexPath:
(在承载表视图的UIViewController
子类内)记录了单元格内容视图的框架,我得到了这个值:
(0.0,0.0, 600.0 ,43.5)
据报道宽度为600,但我认为这是通用的,任何设备'故事板大小(尽管奇怪的是,单元格来自一个单独的xib,只有单元格视图,而不是一个故事板或视图控制器的xib),并且在传递给它后,它将根据表视图进行相应的调整大小(AS旁注,注意高度为43.5, 不 44!)。
我尝试了几件事,并发现了以下内容:
我尝试在单元格的代码中记录标签的框架,如下所示:
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)
那么,表视图单元格上的尾随约束会发生什么?如何将标签对齐到右边缘?
编辑:我在单元格的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点宽!
编辑2: 所以,我发现了问题,显然它是在其他地方:表本身被卡在600点宽,因为我没有将它限制在Interface Builder的视图边缘中。
傻傻的我!
一旦我将表格视图的四个边缘固定到其父视图的边缘,问题就会自行纠正。
首次在Interface Builder中使用表视图...
答案 0 :(得分:2)
首先从该三个标签中删除所有约束,然后按照此步骤逐个添加约束,如下所述。
结果将适用于所有屏幕:
HERE是示例项目。
答案 1 :(得分:1)
将此约束应用于您的标签
左标签的约束 1.导致超级视频 2.超级视图 3.修复高度和宽度
中心标签的约束 横向到超级视图 2.超级视图 3.修复高度和宽度
正确标签的约束 1.追踪到superview 2.超级视图 3.修复高度和宽度