我正在使用表格视图来显示树结构。每个单元对应一个用户可以扩展或折叠的节点。通过在单元的前端具有越来越大的凹口,可以看到每个节点的级别。通过使用layoutMargins设置这些缩进。这对于单元格的标签和分隔符似乎效果很好。这是一些代码:
override func tableView(tableView: UITableView, willDisplayCell cell: UITableViewCell, forRowAtIndexPath indexPath: NSIndexPath) {
let cellLevel = cellLevelForIndexPath(indexPath)
let insets: UIEdgeInsets = UIEdgeInsetsMake(0.0, CGFloat(cellLevel) * 20.0, 0.0, 0.0)
cell.separatorInset = insets
cell.layoutMargins = insets
}
override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
var cell = tableView.dequeueReusableCellWithIdentifier("cellId") as? UITableViewCell
if cell == nil {
cell = UITableViewCell(style: UITableViewCellStyle.Default, reuseIdentifier: "cellId")
}
cell!.preservesSuperviewLayoutMargins = false
cell!.backgroundColor = UIColor.clearColor()
let cellLevel = cellLevelForIndexPath(indexPath)
if let textlabel = cell!.textLabel {
textlabel.text = "Cell @ level \(cellLevel)"
textlabel.textColor = UIColor.blackColor()
}
cell!.selectedBackgroundView = UIView(frame: CGRectZero)
cell!.selectedBackgroundView.backgroundColor = UIColor.cyanColor()
return cell!
}
结果表如下所示:
我现在面临的问题是:如何优雅地将相同的缩进应用于单元格的.selectedBackgroundView,以使其与文本和分隔线齐平?最终结果应如下所示:
注意:我目前正在通过使.selectedBackgroundView更加复杂并添加大小可变的背景色子视图来有效地实现期望的效果,这些子视图有效地掩盖了单元格的某些部分,例如像这样:
let maskView = UIView(frame: CGRectMake(0.0, 0.0, CGFloat(cellLevel) * 20.0, cell!.bounds.height))
maskView.backgroundColor = tableView.backgroundColor
cell!.selectedBackgroundView.addSubview(maskView)
但是我强烈认为必须有更好的方法来做到这一点。
最佳答案
找出一种使其工作的方法。对我来说,诀窍是停止将.selectedBackgroundView视为可见的高光本身(并因此尝试对其进行遮罩或调整其大小),而将其更像是画布。
这就是我最终要做的。首先,一种更方便的方法来获取每个级别的合适插图:
let tableLevelBaseInset = UIEdgeInsetsMake(0.0, 20.0, 0.0, 0.0)
private func cellIndentForLevel(cellLevel: Int) -> CGFloat {
return CGFloat(cellLevel) * tableLevelBaseInset.left
}
然后在cellForRowAtIndexPath中:
cell!.selectedBackgroundView = UIView(frame: CGRectZero)
cell!.selectedBackgroundView.backgroundColor = UIColor.clearColor()
let highlight = UIView(frame: CGRectOffset(cell!.bounds, cellIndentForLevel(cellLevel), 0.0))
highlight.backgroundColor = UIColor.cyanColor()
cell!.selectedBackgroundView.addSubview(highlight)
似乎工作得很好。
关于ios - 如何为UITableViewCell的.selectedBackgroundView设置自定义边距,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/31322667/