【Swift4】TableViewのカスタムセルの高さが変わらない問題の解決法

この記事の概要

UITableViewCellでカスタムセルのために使う.xibファイルを自前で用意したときに、何も設定を加えていない場合はカスタムセルの高さが自動的に変わらない。そこで、カスタムセルの高さに制約を加える方法について、自分なりにまとめた。


[図1] カスタムセルの画面
目次

  • この記事の概要
  • 問題解決の指針
  • 解説①: IBOutletのTableViewを使う方法
  • 解説②: estimatedRowheightとautomaticDimensionを使う方法
  • まとめ

問題解決の指針

TableViewでカスタムセルを使うときに、高さを変えたい時ってありますよね。

例えば、TwitterやインスタグラムのようなSNSはTableViewを使っており、コンテンツの長さや高さによって、 そのセルの高さも変わっている。しかしカスタムセルの高さ変更は、Swiftではなかなか難しく、設定を加えないことでトラブルもよく起こる。

さて、カスタムセルの高さを変えたい時はどうすればいいのだろうか。

カスタムセルの高さを変えたい場合は、tableviewが入ったViewControllerに、このコードを書いてあげると、いいのである。

ポイントとしては、
① @IBOutletのtableViewに、名前をつけてあげること。
②  そのtableviewにestimatedRowHeightと, rowHeightの二つを定義するコードを書いてあげること。


  class ViewController: UIViewController {
    @IBOutlet weak var tableView: UITableView!
  
    override func viewDidLoad() {
        super.viewDidLoad()

        self.tableView.estimatedRowHeight = 90
        self.tableView.rowHeight = UITableViewAutomaticDimension
   }
(以下省略)

以下では、それぞれのコードについて解説する。

解説①: IBOutletのTableViewを使う方法

@IBOutletのtableViewの構文はこちら。

 
 @IBOutlet weak var 【tableViewの名前(任意)】: UITableView!

直入力であれば、「weak」は省略しても良い。
weakがつくのは、二画面分割でStoryboardからコードに矢印を引っ張ってきた時。


weakがある時とない時の違い はコチラ→ (現在調査中)

解説②: estimatedRowHeightとautomaticDimensionを使う方法


ViewController.swift
    override func viewDidLoad() {
        super.viewDidLoad()

        self.tableView.estimatedRowHeight = 90
        self.tableView.rowHeight = UITableViewAutomaticDimension
     }


tableViewが存在するstoryboardと対応するviewControllerに、コチラの2つのコードを書いてあげればいい。



  self.tableView.estimatedRowHeight = (任意の数字)


estimatedRowHeightでは、コード上でカスタムセルの高さを指定して上げる事ができる。
この場合だと、カスタムセルの高さを90にしたいので、右辺に90を代入する。 

この時、xibファイルを使っているのであれば、
Storyboard上の高さと、この数字が必ずしも合致していなければならない。


   self.tableView.rowHeight = UITableViewAutomaticDimension


このコードは必ず書かなければならない。

UITableViewAutomaticDimensionと記述することで、viewDidLoad内の処理が読み込まれた時に、カスタムセルの高さを自動的に決定することが出来るのである。

まとめ


いかがであっただろうか。

まとめとしては、
① tableViewに名前をつける
② estimatedRowHeightとautomaticDimensionを記述する。

この二つを守ることで80%くらいの確率でうまくいく。

しかし、たまにうまくいかないこともあるので、
その時はGoogle先生に質問しよう。

コメント

このブログの人気の投稿

【Unity】シーンギズモがデフォルトで表示されない時

【Swift4】argument passed to call that takes no arguments の解決策

【Rails5】SyntaxError: (): mapping values are not allowed エラーの解決法