将覆盖视图添加到UICollectionViewCell - 保持重叠

时间:2017-08-02 17:45:58

标签: ios swift uicollectionview uicollectionviewcell addsubview

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

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

{{1}}

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

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

3 个答案:

答案 0 :(得分:3)

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

以下是解决这个问题的方法:

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

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

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

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

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

答案 1 :(得分:2)

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

中创建单元格

答案 2 :(得分:2)

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

将此代码放入您的单元格

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' s alpha设置为50%

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