UITableViewCell比其UITableView宽-向右延伸?

时间:2019-01-29 06:41:01

标签: ios swift xcode autolayout interface-builder

背景

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

问题

当此单元格由表格视图出队时,其宽度超出了右侧表格视图的宽度。

这里是UILabel位于单元格中央的xib,然后是它在设备上的显示方式。请注意标签在设备上如何偏离中心:

centred xib centred device

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

right xib right device

当我将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)
        }
    // ...
}

这是表格视图注册单元格的方式:

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
}

任何人都可以帮助您了解发生了什么吗?为什么我的单元格似乎超出了表格视图的宽度?

2 个答案:

答案 0 :(得分:2)

分配任何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
    }
    // ...
}

答案 1 :(得分:0)

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

删除代码

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

注册过程就像

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

出队过程还可以。