Collection view cell部分视图背景色渲染错误问题求助
问题原因
- 颜色赋值逻辑分支覆盖不全:当前代码仅在
properties?.appearance?.cardHeader不存在、或cardHeader存在且包含backgroundColor两个场景下,才会给后方视图集合bgCollection设置颜色。如果cardHeader存在但没有配置backgroundColor,bgCollection内的视图会保留prepareForReuse设置的透明色,若出现视图加载时序异常,就会残留上一次复用的旧颜色。 - 集合填充时序不同步:调用
update方法设置颜色时,bgCollection还没有完成所有后方视图的收集,部分需要改色的视图未被纳入集合,导致这部分视图没有被设置新颜色,保留了上一次单元格复用的旧值。而顶层的typeBackground是固定的单个视图,不存在漏加的问题,因此顶层颜色显示始终正常。 - 复用清理逻辑不彻底:仅在
prepareForReuse阶段重置颜色,没有在每次触发更新前先清理旧值,一旦更新逻辑的分支没有覆盖到所有场景,就会出现旧颜色残留的问题。
修复方案
- 补全颜色赋值的全部分支,保证所有场景下
bgCollection和typeBackground都会被设置明确的颜色值,不存在无赋值的中间状态。 - 调整颜色设置时机,确保调用颜色赋值逻辑时,
bgCollection已经收集完所有需要改色的后方视图。可以将颜色赋值逻辑后移到视图布局完成的回调(如layoutSubviews)中执行,或者在collectionView完成 reload 操作后再触发颜色更新。 - 优化复用清理逻辑,在每次执行
update方法的开头就重置所有相关视图的颜色,从根源上避免旧值残留。
修改后的代码示例如下:
override func prepareForReuse() { super.prepareForReuse() resetViewColors() } func update(resource: Resource, properties: CatalogProperties?) { // 开头先重置所有颜色,避免旧值残留 resetViewColors() let defaultColor = UIColor.init(hexString: "#7C58C5") if let cardColor = properties?.appearance?.cardHeader { // 处理背景色 let bgColor = cardColor.backgroundColor.flatMap { UIColor(red: CGFloat($0.rgb![0] / 255), green: CGFloat($0.rgb![1] / 255), blue: CGFloat($0.rgb![2] / 255), alpha: CGFloat($0.alpha ?? 1)) } ?? defaultColor for bgView in bgCollection { bgView.backgroundColor = bgColor } typeBackground.backgroundColor = bgColor // 处理前景色 if let fgColor = cardColor.foregroundColor { typeLabel.textColor = UIColor(red: CGFloat(fgColor.rgb![0] / 255), green: CGFloat(fgColor.rgb![1] / 255), blue: CGFloat(fgColor.rgb![2] / 255), alpha: CGFloat(fgColor.alpha ?? 1)) } } else { typeBackground.backgroundColor = defaultColor for bgView in bgCollection { bgView.backgroundColor = defaultColor } } } // 抽离公共的颜色重置方法,复用逻辑统一维护 private func resetViewColors() { typeBackground.backgroundColor = .clear for bgView in bgCollection { bgView.backgroundColor = .clear } }
内容的提问来源于stack exchange,提问作者jasmine
相关产品推荐
相关产品推荐

