UITableViewCell 比它的 UITableView 更宽 - 向右延伸?
Posted
技术标签:
【中文标题】UITableViewCell 比它的 UITableView 更宽 - 向右延伸?【英文标题】:UITableViewCell is wider than its UITableView - extending to the right? 【发布时间】:2019-01-29 06:41:01 【问题描述】:背景
我有一个带有单个单元格的 UITableView
。单元格内是UILabel
。名为PickerTableViewCell
的单元格从xib 获取其UI 并将其添加到其子视图中。这样做是因为这个 xib 被许多不同的自定义单元格使用。
问题
当这个单元格被表格视图出列时,它的宽度似乎超出了右侧表格视图的宽度。
这是带有UILabel
在单元格中居中的xib,然后是它在设备上的显示方式。注意标签在设备上是如何偏离中心的:
当我将标签移动到单元格的最右侧 (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)
// ...
这是 tableview 注册单元格的方式:
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
谁能帮助理解发生了什么?为什么我的单元格似乎超出了表格视图的宽度?
【问题讨论】:
使用标签约束:top、bottom、leading、trailing = 0 with superview and domyLabel.textAlignment = .center
【参考方案1】:
在分配任何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
// ...
【讨论】:
不同意,这是post,SO 从 XIB 加载单元格,但没有人向单元格提供框架,这是可以理解的 为什么。 这完美解决了!我正在为此拉头发-谢谢! @dahiya_boy 我不这么认为,试试你的情况并告诉我;)我在这里知道你的答案:D @SohilR.Memon,我直接加载XIB并注册。我从来没有做过这种做法(添加为子视图),因为它从来都不是必需的,我不认为这是一个好的做法 bcz 你的 xib 是UITableviewCell
,当你使用 nib?.first
时,它会将单元格本身作为 UIView 所以为什么它需要添加为子视图。
@SohilR.Memon,我已经提到了单元格本身 UIView
和 OP 从 nib 向其中添加了一个视图,这对我来说是无法消化的。休息一下,每个人都有自己的风格代码,所以我不能再提交了。顺便说一句,感谢您的解释。【参考方案2】:
如果使用 Nib 进行单元设计,请不要注册单元类本身,而是注册 nib。
删除代码
init(style: UITableViewCell.CellStyle, reuseIdentifier: String?)
注册过程是这样的
let cellNib = UINib.init(nibName: "YourNibName", bundle: nil)
tableView.register(cellNib, forCellReuseIdentifier: "Identifier")
出列过程没问题。
【讨论】:
以上是关于UITableViewCell 比它的 UITableView 更宽 - 向右延伸?的主要内容,如果未能解决你的问题,请参考以下文章
UITableViewCell 中 UIButton 的 NSIndexPath
如何在 UITableViewCell 上使用 CAGradientLayers
如何在 UITableViewCell 中添加多行文本字段?
当附件是UITableViewCellAccessoryCheckmark时,如何将文本置于UITableViewCell中