私は、画像またはカスタムとして生成されたアイコンを表示する必要があるcollectionViewセルを持っていますUIView
(たとえばIconView
)。 現在、サブビューとしてUIImageView
とIconView
をコンテナビューに追加して実装しました。入力プロパティとして提供されたイメージまたはカスタム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}
}
}
* 2つの異なる「UICollectionViewCell」を使用できなかった理由はありますか? – Cyrille
私が使用するcollectionViewセルはかなり長く、イメージ/アイコンはレイアウトの違いだけです。 2つのUICollectionViewがパフォーマンスを向上させるかどうかは分かりません。なぜなら、より少ないセルしか再利用できないからです。さらに、各クラスと共通の親クラスですべての制約を繰り返す必要があります。それほど魅力的ではありませんが、それが唯一の方法ならば私はそれを検討します。しかし、本当に単一のセルにカスタムビューを表示することはできませんか? – Taco