Добавление представления наложения к UICollectionViewCell - продолжает наложение
Я пытаюсь добавить 50% черного альфа-представления в каждую ячейку представления коллекции. Ячейки представления коллекции имеют фоновую фотографию и текст сверху. Хотелось бы, чтобы наложение было между ними.
В моем методе 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 добавляется поверх моего текста (он мне нужен ниже текста).
Как я могу предотвратить многократное добавление оверлея и добавление его между правильными слоями ячейки?
3 ответа
Это происходит потому, что ваши ячейки снимаются и повторно используются несколько раз, поэтому вы добавляете несколько слоев.
Поместите этот код в класс вашей клетки
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
UITableView
есть метод повторного использования ячеек, чтобы сделать его более эффективным (сохраняя только необходимые ячейки в памяти). Из-за этого повторно используемая ячейка может уже иметь это подпредставление, поэтому вызов addSubview
снова заставляет другой вид быть добавленным сверху этого.
Вот как это решить:
Переехать addSubview(overlayView)
к layoutSubviews()
метод внутри вашего подкласса ячейки.
override func layoutSubviews() {
super.layoutSubviews()
addSubview(overlayView)
}
Удалить вид наложения в prepareForReuse()
метод внутри вашего подкласса ячейки.
override func prepareForReuse() {
super.prepareForReuse()
overlayView.removeFromSuperview()
}
Обратите внимание, что для этого необходимо определить представление наложения в подклассе ячейки (что, вероятно, следует делать, поскольку сама ячейка должна отвечать за свои собственные подпредставления).
Избегайте добавления этого в cellForItem. Ячейки используются повторно, поэтому, если вы продолжите добавлять представление, это добавит один верх другого. При повторном использовании ячейки ранее добавленное представление не удаляется. Вместо этого вы можете добавить представление в ячейку Prototype или XIB и установить его альфа на то, что вы хотите. Или, если вы создаете ячейку программно, вы можете сделать это в awakeFromNib()