Добавление представления наложения к 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()

Другие вопросы по тегам