UITableViewCell 比它的 UITableView 更宽 - 向右延伸?

UITableViewCell is wider than its UITableView - extending to the right?

背景

我有一个只有一个单元格的 UITableView。单元格内部是一个UILabel。名为 PickerTableViewCell 的单元格从 xib 获取其 UI 并将其添加到其子视图。这样做是因为这个 xib 被许多不同的自定义单元格使用。

问题

似乎当此单元格被 table 视图出队时,其宽度超出了右侧的 table 视图宽度。

这是 xib,UILabel 在单元格内居中,后面是它在设备上的显示方式。注意标签在设备上是如何偏离中心的:

当我将标签移到单元格的最右侧 (label.trailing = pickerCell.trailing + 0) 时,它会从右侧消失。下面是它在 xib 中的样子,以及它在设备上的样子:

当我将 UILabel 对齐到单元格左侧 (label.leading = pickerCell.leading + 0) 时,它在设备上正确对齐到左侧。

下面是 PickerTableViewCell 加载 xib 的方式:

override init(style: UITableViewCell.CellStyle, reuseIdentifier: String?) {
        super.init(style: style, reuseIdentifier: reuseIdentifier)


        // load the xib to associate with
        let nib = Bundle.main.loadNibNamed("PickerTableViewCell", owner: nil, options: nil)
        if let view = nib?.first as? UIView{
            self.addSubview(view)
        }
    // ...
}

下面是 table 视图注册单元格的方式:

self.tableView.register(PickerTableViewCell.self, forCellReuseIdentifier: "pickerCell")

最后是出列方式:

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCell(withIdentifier: "pickerCell") as! PickerTableViewCell
        return cell
}

谁能帮忙理解这是怎么回事??为什么我的单元格似乎超出了 table 视图的宽度?

在分配任何 xib 时,您必须指定 frame。这是修改后的代码:

override init(style: UITableViewCell.CellStyle, reuseIdentifier: String?) {
    super.init(style: style, reuseIdentifier: reuseIdentifier)

    // load the xib to associate with
    let nib = Bundle.main.loadNibNamed("PickerTableViewCell", owner: nil, options: nil)
    if let view = nib?.first as? UIView{
        self.addSubview(view)
        view.frame = bounds //Provide the frame
    }
    // ...
}

如果使用 Nib 进行单元设计,请不要注册单元 class 本身,而是注册 nib。

删除代码

init(style: UITableViewCell.CellStyle, reuseIdentifier: String?) 

注册过程就像

let cellNib = UINib.init(nibName: "YourNibName", bundle: nil)
tableView.register(cellNib, forCellReuseIdentifier: "Identifier")

出队过程正常。