向 UICollectionViewCell 添加覆盖视图 - 保持覆盖

Adding an overlay view to UICollectionViewCell - keeps overlaying

我正在尝试在每个集合视图单元格上添加 50% 黑色 alpha 视图。集合视图单元格顶部有背景照片和文本。希望叠加视图介于两者之间。

在我的 cellForItemAt 方法中,我使用以下内容:

let overlayView = UIView()
overlayView.backgroundColor = UIColor(red: 0, green: 0, blue: 0, alpha: 0.5)
overlayView.frame = cell.bounds
cell.addSubview(overlayView)

问题是当我向下滚动然后向上滚动时,叠加层不断添加,使 alpha 比 50% 暗得多。此外,overlayView 被添加到我的文本之上(我需要它在文本下方。)

如何防止叠加层多次添加,并将其添加到单元格的正确层之间?

避免在 cellForItem 中添加它。单元格被重复使用,因此如果您继续添加视图,它会一个接一个地添加。重新使用单元格时,不会删除先前添加的视图。相反,您可以在 Prototype 单元格或 XIB 中添加视图并将其 alpha 设置为您想要的任何值。或者,如果您以编程方式创建单元格,则可以在 awakeFromNib()

发生这种情况是因为您的单元格多次出列和重复使用,因此,您正在添加多个层。

将此代码放入您的单元格 class

override func awakeFromNib() {
    super.awakeFromNib()
    let overlayView = UIView()
    overlayView.backgroundColor = UIColor(red: 0, green: 0, blue: 0, alpha: 0.5)
    overlayView.frame = self.bounds
    self.addSubview(overlayView)
}

或者,如果您想获得相同的结果,您可以设置黑色 backgroundColor 并将 imageView 的 alpha 设置为 50%

cell.backgroundColor = .black
cell.imageView.alpha = 0.5

UITableView 有一种重用单元格以提高效率的方法(只在内存中保留所需的单元格)。因此,重用的单元格可能已经有这个子视图,所以再次调用 addSubview 会导致在它上面添加另一个视图。

解决方法如下:

addSubview(overlayView) 移动到单元格子类中的 layoutSubviews() 方法。

override func layoutSubviews() {
    super.layoutSubviews()
    addSubview(overlayView)
}

在您的单元格子类中的 prepareForReuse() 方法中删除叠加视图。

override func prepareForReuse() {
    super.prepareForReuse()
    overlayView.removeFromSuperview()
}

请注意,这需要您在单元格的子类中定义叠加视图(您可能应该这样做,因为单元格本身应该负责其自己的子视图)。