selectedBackgroundView

selectedBackgroundView

我正在使用表格视图来显示树结构。每个单元对应一个用户可以扩展或折叠的节点。通过在单元的前端具有越来越大的凹口,可以看到每个节点的级别。通过使用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/

10-08 21:00