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

标签 ios swift uitableview autolayout interface-builder

我已经对 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! ).

我试过很多东西,发现了以下几点:

  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)

相反,如果我删除尾随约束并将其替换为内容 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 ...

最佳答案

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

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

enter image description here

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

enter image description here

  1. 为右标签添加这 5 个约束:

enter image description here

结果将适用于所有屏幕:

enter image description here

HERE是示例项目。

关于ios - UITableViewCell 无法将标签约束到右边缘,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30882795/

相关文章:

ios - Swift 2 - REST 服务和由搜索栏过滤的 TableView

ios - 打开自定义 UITableViewCell 时在溢出菜单中显示/隐藏辅助功能元素

swift - Xcode 自动生成的单元测试

ios - scrollView ContainerView 内的 Swift 3.0 UiTableView 未调用 DidSelectRow(Twitter 配置文件)

ios - 添加 xib tableview 单元格的 subview (swift)

ios - 从 subview 加载 UIImagePickerController

swift - 在 Swift 中清除可选变量

ios - CAShapeLayer() 绘制奇怪的线条/路径

ios - 我们应该使用哪个 pod 而不是 GoogleAnalytics-iOS-SDK?

iphone - iPhone后台模式下的内部时钟