質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

89.99%

UICollectionCellViewをタップ時に色が変わるようにしたい

解決済

回答 1

投稿

  • 評価
  • クリップ 0
  • VIEW 907

Takahashi.

score 24

cellをタップした時にそのcellの色を変わるようにしたんですが、うまく行かないのですがなんででしょうか。また、どう直せばいいのか教えて欲しいです。

...省略...
func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {
        let cell : CustomUICollectionViewCell = collectionView.dequeueReusableCell(withReuseIdentifier: "MyCell", for: indexPath) as! CustomUICollectionViewCell
        cell.image.backgroundColor = UIColor.red
        print("Num: \(indexPath.row)")
        usePhoto = indexPath.row




    }

    func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
        return icon.count
    }

    func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
        let cell : CustomUICollectionViewCell = collectionView.dequeueReusableCell(withReuseIdentifier: "MyCell", for: indexPath) as! CustomUICollectionViewCell
        cell.image.image = icon[indexPath.row]
        return cell
    }
import UIKit

class CustomUICollectionViewCell: UICollectionViewCell {
    var  image = UIImageView()
    var myview = UIView()
    required init(coder aDecoder: NSCoder) {
        super.init(coder: aDecoder)!
    }

    override init(frame: CGRect) {
        super.init(frame: frame)


        image = UIImageView(frame: CGRect(x:0, y:0, width:frame.width, height:frame.height))
        myview = UIImageView(frame: CGRect(x:0, y:0, width:frame.width, height:frame.height))
        image.backgroundColor = UIColor.clear
        //myview.backgroundColor = UIColor.red
        self.contentView.addSubview(myview)
        self.contentView.addSubview(image)
    }


}
  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • fuzzball

    2018/03/01 10:56

    「うまく行かない」とは?

    キャンセル

  • Takahashi.

    2018/03/01 12:15

    色が変わらないです。

    キャンセル

回答 1

checkベストアンサー

0

とりあえず、

cell.contentView.backgroundColor = .red

で色は変わると思います。

あとは、「セルの再利用」について調べて下さい。

 セルの取得

セルの取得方法が間違っています。

if let cell = collectionView.cellForItem(at: indexPath) {
    cell.contentView.backgroundColor = .red
}

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/03/01 13:44

    できました。ありがとうございます。
    しかし、再利用の仕組みがよくわからないです。
    タップしていないセルが反応したりします。

    キャンセル

  • 2018/03/01 13:55

    画面外に出たセルは(画面外に出たときの状態のまま)再利用されます。
    今回の場合だと、背景色が赤い状態で画面外に出たセルは、dequeueReusableCell(withReuseIdentifier:for:)でセルを取得したとき、すでに背景色が赤い状態、ということです。

    これを解決するには、
    ・全セルの背景色の状態を保持するための変数(配列など)を用意する。
    ・collectionView(_:didSelectItemAt:)の中では、上記変数を変更し、セルを更新(リロード)する。
    ・collectionView(_:cellForItemAt:)の中では、上記変数を参照してセルの背景色を設定する。
    という流れになります。

    UITableViewも同じ仕組みなので、そちらで探した方が多くの記事が見つかるのではないかと思います。

    キャンセル

  • 2018/03/02 09:54

    できました。ご丁寧にありがとうございます。

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 89.99%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる