我试图在每个集合视图单元格上添加50%的黑色alpha视图。集合视图单元格顶部有背景照片和文本。希望叠加视图介于两者之间。
在我的cellForItemAt方法中,我使用以下内容:
{{1}}
问题是当我向下滚动,然后向上,覆盖层不断添加,使得alpha远比50%暗。此外,overlayView正在我的文本之上添加(我需要它在文本下方。)
如何阻止叠加层多次添加,并将其添加到单元格的正确图层之间?
答案 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