背景
我有一个带有单个单元格的UITableView
。单元格内部是UILabel
。名为PickerTableViewCell
的单元格从xib获取其UI,并将其添加到其子视图中。这样做是因为许多不同的自定义单元都使用了该xib。
问题
当此单元格由表格视图出队时,其宽度超出了右侧表格视图的宽度。
这里是UILabel
位于单元格中央的xib,然后是它在设备上的显示方式。请注意标签在设备上如何偏离中心:
当我将标签移到单元格(label.trailing = pickerCell.trailing + 0
)的最右边时,它会从右侧消失。以下是xib在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)
}
// ...
}
这是表格视图注册单元格的方式:
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
}
任何人都可以帮助您了解发生了什么吗?为什么我的单元格似乎超出了表格视图的宽度?
答案 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")
出队过程还可以。