Main Story boardにCollection Viewを設置し、そこに何個かボタン(cell)を設置しました。そのcellを時間ごとに色を変えたいのですがどうすればよいのですか??
例:6つのcellのうち5つは青1つは黄色で1秒ごとに変える
みたいな感じです。
これはタイマーとくくりつけてやるのですか?(?)
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答4件
0
ベストアンサー
基本的には過去のご質問と同じです。
過去のご質問のコードには、タイマ処理の呼び出し部分も書かれていたのでおそらくそれで問題ないとおもますが、例えば下記のような感じになります。
Swift
1class ViewController: UIViewController, UICollectionViewDataSource, UICollectionViewDelegate { 2 var redCellIndex: Int = Int.random(in: 0..<12) 3 4 // 略 5 6 override func viewDidLoad() { 7 super.viewDidLoad() 8 // 略 9 Timer.scheduledTimer(timeInterval: 1.0, target: self, selector: #selector(changeColor), userInfo: nil, repeats: true) 10 } 11 12 @objc func changeColor() { 13 redCellIndex = Int.random(in: 0..<12) 14 collectionView.reloadData() 15 } 16 17 func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell { 18 let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "Cell", for: indexPath) 19 // indexPath.row が redCellIndex と一致した場合は赤に、そうでなければ黒にする 20 cell.backgroundColor = self.redCellIndex == indexPath.row ? .red : .black 21 22 return cell 23 24 } 25 // 略 26}
##追記
ミスが2箇所あります。
色を変更するための関数内で次に色を変えたいセルの番号を作る際、let
をつけて宣言してしまっているため、同名でスコープの違う変数となってしまっています。今回の場合let
は必要ありません。
Swift
1@objc func changeColor() { 2 // let をつけると、changeColor() 関数内部だけで有効な変数となってしまう。 3 //let redCellIndex: Int = Int.random(in: 0..<12) 4 redCellIndex = Int.random(in: 0..<12) 5 collectionView.reloadData() 6 }
また、上記の関数を呼び出している部分がありません。
おそらく、以前はタイマ割り込みで呼び出していたのだと思いますが、残り秒数をカウントダウンする関数を呼び出すように変更した際、誤って消してしまったのだと思います。
1秒に1回更新するのであれば、たとえばdown()
の中から色のついたセルを変更するようにする方法もありますし、タイマのインスタンスを2つ作る方法もあるかと思います。
(2020年9月9日:下記のソースコードは変更されています)
Swift
1 var colorCount = 0 2 3 @objc func down() { 4 // 1 秒に1回呼び出す 5 colorCount += 1 6 if colorCount == 100 { 7 colorCount = 0 8 changeColor() 9 } 10 11 if count >= 0{ 12 count = count - 0.01 13 timerLabel.text = String(format: "%.2f",count) 14 }else{ 15 if timer.isValid{ 16 timer.invalidate() 17 timerLabel.text = "Finish" 18 // point = point+0 19 } 20 } 21 }
投稿2020/08/27 03:29
編集2020/09/09 04:16総合スコア5086
0
Swift
1 override func viewDidLoad() { 2 super.viewDidLoad() 3 4 OnGame = true 5 self.collectionView.delegate = self 6 self.collectionView.dataSource = self 7 8 let layout = UICollectionViewFlowLayout() 9 layout.sectionInset = UIEdgeInsets(top: 15, left: 15, bottom: 15, right: 15) 10 collectionView.collectionViewLayout = layout 11 12 if !timer.isValid { 13 timer = Timer.scheduledTimer(timeInterval:0.01,target: self,selector: #selector(self.down),userInfo:nil,repeats:true) 14 } 15 16 self.collectionView!.register(UICollectionViewCell.self, forCellWithReuseIdentifier: reuseIdentifier) 17 } 18 @objc func changeColor() { 19 let redCellIndex: Int = Int.random(in: 0..<12) 20 collectionView.reloadData() 21 } 22 // 中略 23 24 func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell { 25 let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "cell", for: indexPath) 26 27 cell.backgroundColor = self.redCellIndex == indexPath.row ? .red : .black 28 29 return cell 30 31 }
投稿2020/09/07 02:23
編集2020/09/07 02:25総合スコア10
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
Swift
1func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell { 2 let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "cell", for: indexPath) 3
投稿2020/09/07 02:22
編集2020/09/07 04:48総合スコア10
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
swift
1 func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {
投稿2020/09/07 02:19
編集2020/09/07 04:47総合スコア10
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/08/27 03:32
2020/09/07 01:30
2020/09/07 02:05
2020/09/07 02:27
2020/09/07 04:12
2020/09/07 04:31
2020/09/07 05:24
2020/09/07 05:28
2020/09/09 02:23
2020/09/09 04:18