无法在 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的动态高度