如何在不设置整个表格的插入情况下实现UITableView设置其单元格的插入?

7
我有一个UITableViewCell,其中的内容延伸到其所有边缘。我在多个表格中使用此单元格,在这些表格中需要不同的插入(例如,一个表格将其从左侧插入8个点,另一个表格将其插入20个点)。我想在父UITableView代码(可能是cellForRow?)中缩进单元格,而不缩进整个表格。
显然,这会将其设置为整个表格,但我希望根据需要逐个单元格进行操作:
tableView.contentInset = UIEdgeInsets(top: 0, left: 20, bottom: 0, right: -20)

这没有任何效果:

tableViewCell.contentView.layoutMargins = UIEdgeInsets(top: 0, left: 20, bottom: 0, right: -20)

即使这个功能在单元格本身上,也无法正常工作:

override func layoutMarginsDidChange() {
    super.layoutMarginsDidChange()

    self.layoutMargins = UIEdgeInsets(top: 0, left: 20 bottom: 0, right: -20)
}

你的单元格是自定义的UITableViewCell子类吗?如果是,你可以在其中编写布局代码。 - Connor Neville
@Connor 是的,我正在使用自定义的UITableViewCell子类。但是我无法在其中编写代码,因为该单元格用于不同的表格,并且该单元格不知道它在哪个表格中。 - Justin Vallely
那么,在你的 cellForRow 中,你可能会传递一些对象来配置你的自定义单元格,对吧?我建议扩展该对象(或传递第二个对象),以包含一个变量,告诉单元格是否有条件地使用不同的布局。 - Connor Neville
@Connor 你说得很有道理,但是正如我所提到的,对于单元格来说 override func layoutMarginsDidChange() { 似乎没有任何效果。 - Justin Vallely
当调用 cellForRow 并创建单元格时,您应该在将单元格返回给 UITableView 之前为每个单独的单元格设置它。 - Nordeast
1个回答

1
请确保在xib/storyboard中约束到边距。然后在UITableViewCell上设置以下内容:
var topInset: CGFloat = 0
var leftInset: CGFloat = 0
var bottomInset: CGFloat = 0
var rightInset: CGFloat = 0

override func layoutMarginsDidChange() {
    super.layoutMarginsDidChange()
    self.layoutMargins = UIEdgeInsets(top: topInset, left: leftInset, bottom: bottomInset, right: rightInset)
}

然后在tableView的cellForRowAt中使用以下内容:

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let browseTableViewCell = tableView.dequeueReusableCell(withIdentifier: "BrowseTableViewCell", for: indexPath) as! BrowseTableViewCell

    browseTableViewCell.leftInset = 20
    browseTableViewCell.rightInset = 20
    // Top and bottom insets are not needed. They will default to 0.

    return browseTableViewCell
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接