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")
出队过程正常。
背景
我有一个只有一个单元格的 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")
出队过程正常。