完全に理解する Storyboard & UIKit (Day 16): UITableViewのカスタムセル作成
S7r1n9y
Engineer
このシリーズの記事一覧
- 1. 完全に理解する Storyboard & UIKit (Day 1): 基礎概念と歴史
- 2. 完全に理解する Storyboard & UIKit (Day 2): XcodeでのStoryboardの基本操作
- 3. 完全に理解する Storyboard & UIKit (Day 3): UIViewControllerのライフサイクル
- 4. 完全に理解する Storyboard & UIKit (Day 4): Auto Layoutの基本原理
- 5. 完全に理解する Storyboard & UIKit (Day 5): Auto Layoutの複雑な制約の解決
- 6. 完全に理解する Storyboard & UIKit (Day 6): UIStackViewを使った効率的なレイアウト設計
- 7. 完全に理解する Storyboard & UIKit (Day 7): Size Classesによるレスポンシブデザイン
- 8. 完全に理解する Storyboard & UIKit (Day 8): Segueによる画面遷移とデータ渡し
- 9. 完全に理解する Storyboard & UIKit (Day 9): Navigation Controllerの活用
- 10. 完全に理解する Storyboard & UIKit (Day 10): Tab Bar Controllerの活用
- 11. 完全に理解する Storyboard & UIKit (Day 11): 基本的なUI部品(UILabel, UIButton, UITextField)
- 12. 完全に理解する Storyboard & UIKit (Day 12): UITextViewとキーボードハンドリング
- 13. 完全に理解する Storyboard & UIKit (Day 13): UIImageViewと画像リソース管理
- 14. 完全に理解する Storyboard & UIKit (Day 14): UIScrollViewとコンテンツのスクロール
- 15. 完全に理解する Storyboard & UIKit (Day 15): UITableViewの実装基礎
- 16. 完全に理解する Storyboard & UIKit (Day 16): UITableViewのカスタムセル作成
- 17. 完全に理解する Storyboard & UIKit (Day 17): UICollectionViewの実装基礎
- 18. 完全に理解する Storyboard & UIKit (Day 18): UICollectionViewのカスタムレイアウト
- 19. 完全に理解する Storyboard & UIKit (Day 19): Custom Viewの作成とStoryboardでの利用(@IBDesignable, @IBInspectable)
- 20. 完全に理解する Storyboard & UIKit (Day 20): アニメーションの実装(UIView Animation)
- 21. 完全に理解する Storyboard & UIKit (Day 21): Gesture Recognizerによるタッチ処理
- 22. 完全に理解する Storyboard & UIKit (Day 22): UIAlertControllerによるアラートとアクションシート
- 23. 完全に理解する Storyboard & UIKit (Day 23): UIDatePickerやUIPickerViewの実装
- 24. 完全に理解する Storyboard & UIKit (Day 24): Storyboard Referenceを用いたStoryboard分割
- 25. 完全に理解する Storyboard & UIKit (Day 25): XIBとStoryboardの使い分け・併用
- 26. 完全に理解する Storyboard & UIKit (Day 26): UIAppearanceによるアプリ全体の色・スタイル管理
- 27. 完全に理解する Storyboard & UIKit (Day 27): ダークモード対応とアセットカタログ
- 28. 完全に理解する Storyboard & UIKit (Day 28): Accessibility(VoiceOver対応など)のUI設計
- 29. 完全に理解する Storyboard & UIKit (Day 29): UIKitからSwiftUIへの移行 / UIKitでのSwiftUI利用
- 30. 完全に理解する Storyboard & UIKit (Day 30): 実践:1つのアプリをStoryboardとUIKitで完成させる
Sponsored
完全に理解する Storyboard & UIKit (Day 16): UITableViewのカスタムセル作成
Day 15では、iOS標準のシンプルなテキストセルを表示させました。しかし実際のアプリでは、「左にユーザーのアイコン、右上に名前、その下にツイート本文、右端にいいねボタン」のように、複雑なレイアウトを持ったリスト行が必要です。
これを実現するのが カスタムセル(Custom UITableViewCell) の作成です。
1. カスタムセル作成の3ステップ
カスタムセルの作成には、「見た目(Storyboard)」と「裏側の設計図(Swiftファイル)」の両方を用意し、紐付ける必要があります。
ステップ1: Viewの作成(Storyboard)
- ViewController上のTableView内に配置した Prototype Cell を選択します。
- セルの高さを広げ、その中に
UIImageViewやUILabelを自由にドラッグ&ドロップして配置します。 - セルの中(Content View)で、Day 4〜6で学んだ Auto Layout または Stack View を駆使して制約をつけます。
- Attributes Inspector で、セルに必ず
Identifier(例:CustomTweetCell)を設定します。
ステップ2: クラスファイルの作成(Swift)
見た目を操作するための専用クラスを作成します。
- Xcodeのメニューから
File > New > File...を選択します。 Cocoa Touch Classを選びます。Subclass of:にUITableViewCellを指定し、名前をCustomTweetCellとして保存します。
ステップ3: Storyboardとコードの紐付け
- 再度Storyboardを開き、作成したセルを選択します。
- Identity Inspector (⌥⌘3) を開き、
Classにステップ2で作成したCustomTweetCellを指定します。 - Assistant Editorを開き、セル内のImageViewやLabelから
CustomTweetCellクラスへ、IBOutlet を接続します。
swift// CustomTweetCell.swift import UIKit class CustomTweetCell: UITableViewCell { @IBOutlet weak var userImageView: UIImageView! @IBOutlet weak var userNameLabel: UILabel! @IBOutlet weak var tweetContentLabel: UILabel! // セルがStoryboardからロードされた直後に呼ばれる初期化メソッド override func awakeFromNib() { super.awakeFromNib() // アイコンを丸くするなどの初期設定をここに書く userImageView.layer.cornerRadius = userImageView.frame.width / 2 } }
2. ViewController側でのセルの呼び出し
セルの準備ができたら、Day 15で実装した cellForRowAt メソッドを修正して、このカスタムセルを呼び出します。
swiftfunc tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { // 1. Identifierを指定し、as? を使って自作クラスの型にキャスト(変換)する guard let cell = tableView.dequeueReusableCell(withIdentifier: "CustomTweetCell", for: indexPath) as? CustomTweetCell else { return UITableViewCell() } // 2. 自作クラスのIBOutletにアクセスしてデータをセットする let tweet = tweetList[indexPath.row] cell.userNameLabel.text = tweet.userName cell.tweetContentLabel.text = tweet.content cell.userImageView.image = UIImage(named: tweet.imageName) return cell }
※ Day 15で使用した defaultContentConfiguration() は標準デザイン専用の機能なので、カスタムセルの場合は従来通り直接IBOutletのプロパティ(.text など)に代入を行います。
3. 高度なテクニック: セルの高さの自動計算
カスタムセルの中に、複数行のテキスト(長文)を表示するラベル(Lines = 0)がある場合、文字数によってセルの高さを動的に変えなければなりません。
昔のiOS開発では文字数から高さを手動計算するという地獄の苦しみがありましたが、現在は Auto Layoutの機能(Self-Sizing Cells)によって自動化されています。
自動計算(Self-Sizing)を有効にする条件
セル内の要素が、セルのTopからBottomまで、Auto Layoutの制約で隙間なく(またはStack Viewで)完全に繋がっていること です。
これにより、Labelの Intrinsic Content Size(文字数による自然な高さ)がセルの外枠を押し広げるように働き、システムがセルの高さを自動算出します。
また、viewDidLoad で以下の2行が設定されていることを確認してください(iOS 11以降はデフォルトで有効になっています)。
swifttableView.rowHeight = UITableView.automaticDimension tableView.estimatedRowHeight = 100 // ざっくりとした平均的な高さ
📝 今日のまとめ
- 標準デザイン以外のリストを作るには、UITableViewCellを継承したカスタムクラス を作成する。
- セルの
IdentifierとCustom Classの設定をStoryboard上で忘れないこと。 cellForRowAtメソッド内で、as? CustomCellClassでキャスト してからプロパティにアクセスする。- セルの高さを文字数に合わせて自動可変にするには、上下のAuto Layout制約を完全に繋ぎ切る必要がある。
これで縦スクロールの美しいリストUIが作れるようになりました。 明日の Day 17 では、TableViewの兄弟であり、縦横無尽なグリッドレイアウト(タイル状の表示など)を可能にする強力なコンポーネント UICollectionView の基礎を学びます。
このシリーズの記事一覧
- 1. 完全に理解する Storyboard & UIKit (Day 1): 基礎概念と歴史
- 2. 完全に理解する Storyboard & UIKit (Day 2): XcodeでのStoryboardの基本操作
- 3. 完全に理解する Storyboard & UIKit (Day 3): UIViewControllerのライフサイクル
- 4. 完全に理解する Storyboard & UIKit (Day 4): Auto Layoutの基本原理
- 5. 完全に理解する Storyboard & UIKit (Day 5): Auto Layoutの複雑な制約の解決
- 6. 完全に理解する Storyboard & UIKit (Day 6): UIStackViewを使った効率的なレイアウト設計
- 7. 完全に理解する Storyboard & UIKit (Day 7): Size Classesによるレスポンシブデザイン
- 8. 完全に理解する Storyboard & UIKit (Day 8): Segueによる画面遷移とデータ渡し
- 9. 完全に理解する Storyboard & UIKit (Day 9): Navigation Controllerの活用
- 10. 完全に理解する Storyboard & UIKit (Day 10): Tab Bar Controllerの活用
- 11. 完全に理解する Storyboard & UIKit (Day 11): 基本的なUI部品(UILabel, UIButton, UITextField)
- 12. 完全に理解する Storyboard & UIKit (Day 12): UITextViewとキーボードハンドリング
- 13. 完全に理解する Storyboard & UIKit (Day 13): UIImageViewと画像リソース管理
- 14. 完全に理解する Storyboard & UIKit (Day 14): UIScrollViewとコンテンツのスクロール
- 15. 完全に理解する Storyboard & UIKit (Day 15): UITableViewの実装基礎
- 16. 完全に理解する Storyboard & UIKit (Day 16): UITableViewのカスタムセル作成
- 17. 完全に理解する Storyboard & UIKit (Day 17): UICollectionViewの実装基礎
- 18. 完全に理解する Storyboard & UIKit (Day 18): UICollectionViewのカスタムレイアウト
- 19. 完全に理解する Storyboard & UIKit (Day 19): Custom Viewの作成とStoryboardでの利用(@IBDesignable, @IBInspectable)
- 20. 完全に理解する Storyboard & UIKit (Day 20): アニメーションの実装(UIView Animation)
- 21. 完全に理解する Storyboard & UIKit (Day 21): Gesture Recognizerによるタッチ処理
- 22. 完全に理解する Storyboard & UIKit (Day 22): UIAlertControllerによるアラートとアクションシート
- 23. 完全に理解する Storyboard & UIKit (Day 23): UIDatePickerやUIPickerViewの実装
- 24. 完全に理解する Storyboard & UIKit (Day 24): Storyboard Referenceを用いたStoryboard分割
- 25. 完全に理解する Storyboard & UIKit (Day 25): XIBとStoryboardの使い分け・併用
- 26. 完全に理解する Storyboard & UIKit (Day 26): UIAppearanceによるアプリ全体の色・スタイル管理
- 27. 完全に理解する Storyboard & UIKit (Day 27): ダークモード対応とアセットカタログ
- 28. 完全に理解する Storyboard & UIKit (Day 28): Accessibility(VoiceOver対応など)のUI設計
- 29. 完全に理解する Storyboard & UIKit (Day 29): UIKitからSwiftUIへの移行 / UIKitでのSwiftUI利用
- 30. 完全に理解する Storyboard & UIKit (Day 30): 実践:1つのアプリをStoryboardとUIKitで完成させる