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

时间:2015-06-17 05:13:29

标签: ios swift uitableview autolayout interface-builder

我已经将UITableViewCell(带有xib)子类化了,我注意到当我使用autolayout / constraints时,我在Interface Builder中放置的标签在运行时无法正确显示。

首先,我将三个标签相对于单元格的内容视图左右,中间和右边对齐。

当我运行我的应用时,最左侧的标签位于左侧,中间标签位于右侧,最右侧的标签无处可见。

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

(0.0,0.0, 600.0 ,43.5)

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

我尝试了几件事,并发现了以下内容:

  1. 如果我在标签上对单元格的前(左),上,下边缘设置约束,则显示相应。
  2. 如果我将标签放在Interface Builder中单元格的最右边,没有任何约束,它会显示我放置它的位置(当然,在旋转到横向时,它会保持与左边缘固定的距离,而不是粘在右边缘。)
  3. 如果我将标签放在任何位置,并在容器的尾部(右)边缘添加约束,则根据约束指定的距离显示或不显示。也就是说,约束似乎停留在单元格的+600原始右边缘。如果我将它放在最左边的边缘附近,但将约束拖到后缘,它会出现在右边的某个位置。
  4. 我尝试在单元格的代码中记录标签的框架,如下所示:

    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中使用表视图...

2 个答案:

答案 0 :(得分:2)

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

  1. 对于左侧标签选择您的标签,请转到图钉菜单,为其添加此5约束。:
  2. enter image description here

    1. 对于中心标签添加此两个约束,因此它始终显示在中心:
    2. enter image description here

      1. 对于正确的标签,添加以下5个约束:
      2. enter image description here

        结果将适用于所有屏幕:

        enter image description here

        HERE是示例项目。

答案 1 :(得分:1)

将此约束应用于您的标签

左标签的约束  1.导致超级视频  2.超级视图  3.修复高度和宽度

中心标签的约束  横向到超级视图  2.超级视图  3.修复高度和宽度

正确标签的约束  1.追踪到superview  2.超级视图  3.修复高度和宽度