向 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()
}
请注意,这需要您在单元格的子类中定义叠加视图(您可能应该这样做,因为单元格本身应该负责其自己的子视图)。
我正在尝试在每个集合视图单元格上添加 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()
}
请注意,这需要您在单元格的子类中定义叠加视图(您可能应该这样做,因为单元格本身应该负责其自己的子视图)。