Добавить представление за пределами contentView в ячейку

#ios #swift #uitableview #uicollectionview #uicollectionviewcell

#iOS #swift #uitableview #uicollectionview #uicollectionviewcell

Вопрос:

У меня есть ячейка представления коллекции, и я хочу добавить в нее представление. Apple заявляет, что представления должны быть добавлены в contentView . Это там документация:

При настройке ячейки вы добавляете в это представление любые пользовательские представления, представляющие содержимое вашей ячейки. Объект cell помещает содержимое в этом представлении перед любыми фоновыми представлениями.

Однако, кажется, я также могу добавить представление не внутри contentView , и нет никаких предупреждений или сбоев. Вот мой код. Обратите внимание на комментарий QUESTION — я хочу знать, можно ли это сделать:

 class MyCollectionViewCell: UICollectionViewCell {

    @IBOutlet private var imageView: UIImageView!

    private let titleLabel = UILabel(frame: .zero)

    override func awakeFromNib() {
        super.awakeFromNib()

        // QUESTION: Is this ok? Notice I am not adding the `titleLabel` to `self.contentView`
        self.addSubview(titleLabel)

        let horizontalCenterConstraint = NSLayoutConstraint(item: titleLabel, attribute: .centerX, relatedBy: .equal, toItem: self, attribute: .centerX, multiplier: 1.0, constant: 0)
        let verticalCenterConstraint = NSLayoutConstraint(item: titleLabel, attribute: .centerY, relatedBy: .equal, toItem: self, attribute: .centerY, multiplier: 1.0, constant: 0)

        self.addConstraint(horizontalCenterConstraint)
        self.addConstraint(verticalCenterConstraint)
    }
}
  

В приведенном выше коде вместо добавления представления с помощью self.contentView.addSubview … вместо этого я просто делаю self.addSubview . Это нормально?

Ответ №1:

Большинство вещей возможно, вопрос в том, почему вы хотите это сделать?

Напрямую нарушая рекомендации автора API, вы рискуете столкнуться с целым рядом потенциальных проблем. например

  • Возможно, вы нарушаете что-то, о чем не знаете
  • Это может отрицательно повлиять на производительность
  • Даже если это работает в настоящее время, это может сломаться в будущем, и у автора нет причин предотвращать это.

Если то, что вы пытаетесь сделать, невозможно иначе, и вы согласны с рисками, дерзайте. В противном случае придерживайтесь явных инструкций автора.

Комментарии:

1. Хорошо, да, я не был уверен в документации Apple. Исходя из того, что вы говорите, я должен добавлять представления только к contentView ячейке правильно?

Ответ №2:

Да, я пытался добавить cell напрямую вместо contentView . Теперь происходит странная вещь: представление коллекции не может прокручиваться. Мне потребовался 1 час, чтобы понять, что я должен добавить себя в contentView