2017-08-02 86 views
2

我尝试添加在每个集合观察室50%的黑色阿尔法视图。集合视图单元格顶部具有背景照片和文本。希望覆盖视图位于两者之间。添加一个覆盖以UICollectionViewCell - 保持覆盖

在我cellForItemAt方法,我用的是以下几点:

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

的问题是,我向下滚动,然后向上,覆盖不断增加,使得阿尔法超过50%的暗得多。此外,overlayView被添加到我的文本顶部(我需要它在文本下方)。

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

+0

在其中添加细胞init文件或cellfortematindex方法OverlayView的? –

回答

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设置透明度为50%

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

这似乎是为了避免覆盖层重叠! – Joe

+0

如何在两层之间添加子视图? – Joe

+0

如果您不需要额外的视图,请查看我更新的答案。 – Phyber

2

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

2

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

下面是如何解决这个问题:

移动addSubview(overlayView)到您的子类里面的layoutSubviews()方法。

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

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

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

注意,这需要你定义在单元格中的子类覆盖视图(你应该做的可能,因为电池本身应该负责自己的子视图)。