无法设置 Swift 中 UITableViewCell 中使用的 UIView 子类的背景颜色

Unable to set the background colour of a UIView subclass used inside a UITableViewCell in Swift

问题:

我的 tableView 中每个单元格的自定义视图背景颜色在声明我的 statusColour 变量时始终使用初始颜色集,并且颜色在 cellForRowAt IndexPath 总是被忽略。


这是我的 UIView 子类:

class SlantedView: UIView {

    var path: UIBezierPath!
    var backgroundColour: UIColor!

    override init(frame: CGRect) {
        super.init(frame: frame)
    }

    required init?(coder aDecoder: NSCoder) {
        super.init(coder: aDecoder)
    }

    func slantedView() {

         // Drawing code
         // Get Height and Width
         let layerHeight = CGFloat(90)
         let layerWidth = CGFloat(300)

         // Create Path
         let bezierPath = UIBezierPath()

         //  Points
         let pointA = CGPoint(x: 0, y: 0)
         let pointB = CGPoint(x: layerWidth, y: 89)
         let pointC = CGPoint(x: layerWidth, y: layerHeight)
         let pointD = CGPoint(x: 0, y: layerHeight)

         // Draw the path
         bezierPath.move(to: pointA)
         bezierPath.addLine(to: pointB)
         bezierPath.addLine(to: pointC)
         bezierPath.addLine(to: pointD)
         bezierPath.close()

         // Mask to Path
         let shapeLayer = CAShapeLayer()
         shapeLayer.path = bezierPath.cgPath
         layer.mask = shapeLayer
     }


    override func draw(_ rect: CGRect) {

        self.slantedView()

        self.backgroundColor = backgroundColour
        self.backgroundColor?.setFill()
        UIGraphicsGetCurrentContext()!.fill(rect)

    }
}



这是我的自定义单元格:

class CustomTableViewCell: UITableViewCell {

    var statusColour: UIColor = {
        let colour = UIColor.red
        return colour
    }()


    override init(style: UITableViewCell.CellStyle, reuseIdentifier: String?) {
        super.init(style: style, reuseIdentifier: reuseIdentifier)

        let statusContainer = SlantedView()
        statusContainer.backgroundColour = self.statusColour
        self.addSubview(statusContainer)

    }

    required init(coder aDecoder: NSCoder) {
        super.init(coder: aDecoder)!
    }

}



这是我的 cellForRow 方法:

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {

    let cell = tableView.dequeueReusableCell(withIdentifier: cellIdentifier, for: indexPath) as! CustomTableViewCell

    cell.statusColour = sampleData[indexPath.row].statusColour //Contains different colours

    return cell
}

问题肯定出在 UIView 子类上。根据之前的一些研究,看起来 overridden draw function 可能是导致问题的原因。

我按照其他一些 Stack Overflow 问题中给出的建议添加了以下几行:

self.backgroundColor?.setFill()
UIGraphicsGetCurrentContext()!.fill(rect)

我可能做错了什么?

提前致谢。

在 awakeFromNib() 方法中添加 slantedView 而不是 init() 并且还使用 属性 观察者来更改 slantedView 的背景颜色,如下所示:

class CustomTableViewCell: UITableViewCell {

    var statusContainer: SlantedView!

    var statusColour: UIColor? {
        didSet {
            guard let color = statusColour else {
                statusContainer.backgroundColor = UIColor.black
                return
            }
        statusContainer.backgroundColor = color
       }
    }

    override func awakeFromNib() {
        super.awakeFromNib()
        statusContainer = SlantedView(frame: self.bounds)
        self.addSubview(statusContainer)
    }
}

最后,从 draw(_ rect: CGRect) 方法中删除最后两行:-

 override func draw(_ rect: CGRect) {
    self.slantedView()
    self.backgroundColor = backgroundColour
}