- ベストアンサー
UICollectionViewで画像をタッチして枠線と番号を表示させる方法
- SwiftのUICollectionViewを使用して、画像をタッチすると枠線と番号を表示させる方法について教えてください。
- 現在、UICollectionViewで画像を表示していますが、画像をタッチすると最後のセルにだけ番号が表示されます。他のセルでは番号が表示されない理由を教えてください。
- UICollectionViewのセルをタッチした際に、該当のセルに枠線と番号を表示させる方法を教えてください。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
No.1です。 追伸します。 元のソースコードをよく見ると、ラベルだけでなく画像を表示するためにUIImageViewをセルの中で使用していますが、おそらくこちらはstoryboardのセルにUIImageViewを貼り付け、そのUIImageViewのTagに1を設定しているのだと思います。 そして、cellForItemAtIndexPathの中で let imageView = cell.viewWithTag(1) as! UIImageView でセルに配置されているimageViewを取得し、imageView.imageに表示したい画像を設定してちゃんと動作しているのだと思います。 今回問題となっているラベルも、これと同じように、storyboardのセルにUILabelを貼り付け、そのUILabelのTagに2を設定し、 cellForItemAtIndexPathの中で let label = cell.viewWithTag(2) as! UILabel でセルに配置されているlabelを取得し、label.textに表示したい文字列を設定してもよいと思います。 ただ、タグを使う方法は、今後何か機能追加する時に融通が効きにくい(別の用途でタグが使えなくなる)ので、あまり多用せず、カスタムセルを定義する方法もマスターしておいた方がよいと思います。 ちなみに、No.1で紹介した記事はカスタムセルをxibファイルで定義していますが、xibファイルで定義しなくても、storyboardで定義したセルをカスタムセルにしてもかまいません。具体的な手順は、UICollectionViewでなくUITableViewの例になりますが、 http://development.hatenadiary.com/entry/20131228/1388218348 を参考にするとよいと思います。 UITableViewもUICollectionViewも似たようなものです。
その他の回答 (1)
- Lchan0211b
- ベストアンサー率61% (573/930)
> なぜ最後のセルだけなのでしょうか。教えてください。 let numLabel: UILabel = UILabel(frame: CGRectMake(0,0,30,30)) で定義しているnumLabelはViewControllerの中で1個しか存在しないからです。 cellForItemAtIndexPathの中で cell.addSubview(numLabel) を実行して、全てのセルに対してnumLabelを追加しているつもりなのだと思いますが、 numLabelは1個しかないので、新しいセルにnumLabelをaddSubViewしたら、 以前にaddSubViewしたセルのnumLabelは自動的に取り除かれます。 (numLabelが以前のセルから新しいセルに移動する形になります。) このため、最後に表示したセルにnumLabelが1個だけ残る形になります。 これを修正するには、cellForItemAtIndexPathの中で毎回新しいラベルを 確保してセルに追加すればよいという考えもありますが、それをやると、 セルを再利用した時に以前に追加したラベルにさらに追加する形になってしまいます。 その対策としてセルを再利用する時に以前に追加したラベルを削除してから 新しいラベルを追加すればうまくいきますが、結局ラベルを毎回作り直すことに なってしまい、せっかくセルを再利用する形で設計しているのに、再利用の 意味があまりなくなってしまいます。 一般的には、セルに独自のラベルやGUI部品を追加したい場合は カスタムセルを作ります。 具体的なやり方は http://qiita.com/k_kuni/items/9916dab83552b77e7751 を参考にすればよいと思います。 カスタムセルの内部にラベルを定義すれば、セルの確保と同時にラベルが 作成され、セルの再利用と同時にラベルも再利用されます。
お礼
回答ありがとうございます。
お礼
回答ありがとうございます。さらに詳しいアドバイスで助かりました。教えていただいたようにstoryboardを使ってタグで処理することで枠線と番号がきちんとつきました。ありがとうございました。カスタムセルについても勉強します。