0

私は、画像またはカスタムとして生成されたアイコンを表示する必要があるcollectionViewセルを持っていますUIView(たとえばIconView)。 現在、サブビューとしてUIImageViewIconViewをコンテナビューに追加して実装しました。入力プロパティとして提供されたイメージまたはカスタムUIViewを表示することができるCollectionViewCellを実装する方法は?

画像が提供されると、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

* 2つの異なる「UICollectionViewCell」を使用できなかった理由はありますか? – Cyrille

+0

私が使用するcollectionViewセルはかなり長く、イメージ/アイコンはレイアウトの違いだけです。 2つのUICollectionViewがパフォーマンスを向上させるかどうかは分かりません。なぜなら、より少ないセルしか再利用できないからです。さらに、各クラスと共通の親クラスですべての制約を繰り返す必要があります。それほど魅力的ではありませんが、それが唯一の方法ならば私はそれを検討します。しかし、本当に単一のセルにカスタムビューを表示することはできませんか? – Taco

答えて

0

設定時にアイコンビューを削除して削除しないでください。両方を同じ場所に追加し、isHidden、alpha、またはopacityまたはbringSubviewToFrontを変更します。これは主スレッドを集中的に使用することがはるかに少なくなります。

+0

はい、しかし、セルがレンダリングされるたびに、完全な新しい "IconView"が表示されるはずです。アイコンビューのプロパティのみが更新された場合(IconViewが提供されているときに隠されているUIImageViewに対してすでに行っているように)、あなたの提案は正しいでしょう。理想的には、IconViewもプロパティとして提供する必要があります...任意のアイデアですか? – Taco

関連する問題