0

У меня есть ячейка 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} 
    } 
} 
+0

Есть ли причина, по которой вы не могли использовать * два * разных 'UICollectionViewCell'? – Cyrille

+0

Коллекция cellView, которую я использую, довольно длинна, и изображение/значок - единственное различие макетов. Я не знаю, улучшат ли два UICollectionViews производительность, поскольку еще меньшее количество ячеек может быть повторно использовано. Кроме того, для этого потребуется повторить все ограничения в каждом классе и общий родительский класс. Не очень привлекательно, но если это единственный способ, я это рассмотрю. Но действительно ли будет невозможно отображать пользовательские представления в одной ячейке? – Taco

ответ

0

Не устанавливайте и не удаляйте IconView при настройке. Добавьте оба в том же месте и измените isHidden, alpha, opacity или bringSubviewToFront. Это значительно меньше интенсивность потока.

+0

Да, но каждый раз, когда отображается ячейка, должен отображаться полный новый «IconView». Ваше предложение было бы правильным, если бы было обновлено свойство IconView (как я уже делал для UIImageView, который будет скрыт при использовании IconView). В идеале, IconView должен быть предоставлен как свойство ... Любые идеи? – Taco