У меня есть ячейка collectionView, которая должна отображать изображение или значок, который создается как пользовательский UIView
(скажем, IconView
). В настоящее время я реализовал это, добавив UIImageView
и IconView
в качестве подзонов в виде контейнера.Как реализовать CollectionViewCell, который может отображать изображение или пользовательский UIView, предоставляемый как входное свойство?
Когда изображение предоставлено, свойство изображения UIImageView
просто обновляется. Когда предоставляется новый IconView
, он в настоящее время всегда добавляется в виде представления в виде контейнера. Поэтому перед добавлением сначала проверяется, добавлен ли файл IconView
, и если он его удаляет.
Хотя эта реализация работает, она не очень изящна и кажется неэффективной, так как она приводит к проблемам с прокруткой, когда число строк увеличивается.
Будет ли лучший (более эффективный) способ реализовать это для одного CollectionViewCell?
class CustomCell: UICollectionViewCell {
internal var image: UIImage? {
didSet {
self.imageView.image = image!
}
}
internal var iconView: IconView? {
didSet {
if !(self.iconContainerView.subviews.flatMap{ $0 as? IconView}.isEmpty) {
self.iconView!.removeFromSuperview()
}
self.iconView!.translatesAutoresizingMaskIntoConstraints = false
self.iconContainerView.addSubview(self.iconView!)
self.image = nil
}
}
fileprivate var imageView: UIImageView!
fileprivate var iconContainerView: UIView!
fileprivate var layoutConstraints = [NSLayoutConstraint]()
override init(frame: CGRect) {
super.init(frame: frame)
// ContainerView
self.iconContainerView = UIView()
self.iconContainerView.translatesAutoresizingMaskIntoConstraints = false
self.contentView.addSubview(self.iconContainerView)
// ImageView
self.imageView = UIImageView()
self.imageView.translatesAutoresizingMaskIntoConstraints = false
self.iconContainerView.addSubview(self.imageView)
}
required init?(coder aDecoder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
override func layoutSubviews() {
super.layoutSubviews()
self.iconContainerView.leadingAnchor.constraint(equalTo: self.contentView.leadingAnchor).isActive = true
self.iconContainerView.widthAnchor.constraint(equalToConstant: 60).isActive = true
self.iconContainerView.heightAnchor.constraint(equalToConstant: 60).isActive = true
self.iconContainerView.centerYAnchor.constraint(equalTo: self.contentView.centerYAnchor).isActive = true
// Deactivate non-reusable constraints
_ = self.layoutConstraints.map { $0.isActive = false }
self.layoutConstraints = [NSLayoutConstraint]()
if let iconView = self.iconView {
self.imageView.isHidden = true
self.layoutConstraints.append(iconView.centerYAnchor.constraint(equalTo: self.iconContainerView.centerYAnchor))
self.layoutConstraints.append(iconView.centerXAnchor.constraint(equalTo: self.iconContainerView.centerXAnchor))
self.layoutConstraints.append(iconView.heightAnchor.constraint(equalToConstant: 40))
self.layoutConstraints.append(iconView.widthAnchor.constraint(equalToConstant: 40))
} else {
self.imageView.isHidden = false
self.iconView?.isHidden = true
self.layoutConstraints.append(self.imageView.leadingAnchor.constraint(equalTo: self.iconContainerView.leadingAnchor))
self.layoutConstraints.append(self.imageView.trailingAnchor.constraint(equalTo: self.iconContainerView.trailingAnchor))
self.layoutConstraints.append(self.imageView.topAnchor.constraint(equalTo: self.iconContainerView.topAnchor))
self.layoutConstraints.append(self.imageView.bottomAnchor.constraint(equalTo: self.iconContainerView.bottomAnchor))
}
_ = self.layoutConstraints.map {$0.isActive = true}
}
}
Есть ли причина, по которой вы не могли использовать * два * разных 'UICollectionViewCell'? – Cyrille
Коллекция cellView, которую я использую, довольно длинна, и изображение/значок - единственное различие макетов. Я не знаю, улучшат ли два UICollectionViews производительность, поскольку еще меньшее количество ячеек может быть повторно использовано. Кроме того, для этого потребуется повторить все ограничения в каждом классе и общий родительский класс. Не очень привлекательно, но если это единственный способ, я это рассмотрю. Но действительно ли будет невозможно отображать пользовательские представления в одной ячейке? – Taco