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

Posted

技术标签:

【中文标题】无法在 Swift 中设置 UITableViewCell 中使用的 UIView 子类的背景颜色【英文标题】:Unable to set the background colour of a UIView subclass used inside a UITableViewCell in Swift 【发布时间】:2020-04-10 23:29:22 【问题描述】:

问题:

我的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)

我做错了什么?

提前致谢。

【问题讨论】:

你能展示你的 cellForRowAt 吗? @NicolasElPapu 我添加了它。 var statusColour: UIColor = let colour = UIColor.red return colour () 更改为 var statusColour: UIColor = .red 并且您没有将 statusContainer 视图添加到您的单元格 抱歉,我没有包含所有代码以保持问题简短。但是,我已将 statusContainer 添加到代码中的单元格中。该表工作正常,我可以毫无问题地设置所有其他单元格属性。你上面的建议没有任何作用。我所有的其他属性都是这样设置的,我没有遇到任何问题。 【参考方案1】:

在 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

【讨论】:

这让我得到了答案。关键是按照您在示例中所做的方式声明 statusContainer 和 statusColour 变量。我还从 draw rect 函数中删除了除 self.slantedView() 之外的所有行。

以上是关于无法在 Swift 中设置 UITableViewCell 中使用的 UIView 子类的背景颜色的主要内容,如果未能解决你的问题,请参考以下文章

在单独的文件中设置 UITableView 数据源和委托 - swift

尝试使用 Swift 在 UITableView 中的部分标题的 UIView 中设置 UILabel 的文本

UITableview swift中的UITextview高度

如何在swift中设置自定义UITableviewcell的动态高度

从数组中设置自定义单元格 uibutton 标题 - Swift

UIView 子类在 Swift 中设置自己的高度 + UIViewController 中的约束 + 情节提要