2

すべてのコレクションビューセルに50%黒のアルファビューを追加しようとしています。コレクションビューのセルには背景の写真と上のテキストがあります。オーバレイビューが2つの間にあることを望みます。私cellForItemAt法でUICollectionViewCellにオーバレイビューを追加する - オーバーレイを続ける

、私は次のようにします。私は下にスクロールすると問題がある

let overlayView = UIView() 
overlayView.backgroundColor = UIColor(red: 0, green: 0, blue: 0, alpha: 0.5) 
overlayView.frame = cell.bounds 
cell.addSubview(overlayView) 

、そしてアップ、オーバーレイは、50%よりもはるかに暗いアルファを作り、追加し続けます。また、オーバーレイビューがテキストの上に追加されています(テキストの下に必要です)。

オーバーレイが複数回追加されてセルの正しいレイヤーに追加されないようにするにはどうすればよいですか?

+0

ここでは、セル初期化ファイルまたはcellfortematindexメソッドでオーバーレイビューを追加していますか? –

答えて

2

これは、セルがデキューされて複数回再利用されたために発生します。 50%にあなたのセルのクラス

override func awakeFromNib() { 
    super.awakeFromNib() 
    let overlayView = UIView() 
    overlayView.backgroundColor = UIColor(red: 0, green: 0, blue: 0, alpha: 0.5) 
    overlayView.frame = self.bounds 
    self.addSubview(overlayView) 
} 

それとも、同じ結果を達成したい場合は、黒のbackgroundColorを設定し、ImageViewののアルファを設定することができます内側にこのコードを入れて

cell.backgroundColor = .black 
cell.imageView.alpha = 0.5 
+0

これはオーバーレイが重複しないようにするためのトリックをしたようです! – Joe

+0

2つのレイヤーの間にサブビューを追加するのはどうですか? – Joe

+0

追加ビューが不要な場合は、更新された回答を確認してください。 – Phyber

2

これをcellForItemに追加しないでください。セルが再利用されるため、ビューを追加し続けると別のセルの上端が追加されます。セルを再利用すると、以前に追加されたビューは削除されません。代わりに、プロトタイプのセルまたはXIBにビューを追加し、必要に応じてアルファベットを設定することができます。または、セルをプログラムで作成している場合は、awakeFromNib()でそれを実行できます。

2

UITableViewは、メソッドを持っていますセルを再利用してより効率的にする(必要なセルだけをメモリに保持する)このため、再利用されたセルにはすでにこのサブビューが存在する可能性があります。したがって、addSubviewを呼び出すと、もう1つのビューがその上に追加されます。あなたの細胞サブクラスの内部layoutSubviews()方法に

移動addSubview(overlayView):ここ

は、この問題を解決する方法です。

override func layoutSubviews() { 
    super.layoutSubviews() 
    addSubview(overlayView) 
} 

セルサブクラス内のprepareForReuse()メソッドのオーバーレイビューを削除します。これは、(セル自体が独自のサブビューのために責任を負わなければならないので、あなたはおそらく行う必要があります)セルのサブクラスでオーバーレイビューを定義する必要があること

override func prepareForReuse() { 
    super.prepareForReuse() 
    overlayView.removeFromSuperview() 
} 

注意。

関連する問題