読者です 読者をやめる 読者になる 読者になる

UITableView のセルの高さを可変にする

高さが可変の UILabel や UIImageView を UITableView のセルに配置したときには、もちろんセルの高さも可変にしたいと思います。

その方法を書きます。

ちなみに UILabel の行数を可変にする方法はこちらのエントリで書きました。

komaji504.hateblo.jp

セルの高さを可変にする

と言っても簡単で、以下のメソッドを実装してセルの見積もりの高さと、実際の高さを UITableViewAutomaticDimension で指定するだけです。

    func tableView(tableView: UITableView, estimatedHeightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat {
        return 100 // セルの高さの見積もり
    }
    
    func tableView(tableView: UITableView, heightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat {
        return UITableViewAutomaticDimension
    }

UITableView は estimatedRowHeight, rowHeight プロパティを持っているので、上記のメソッドを実装せずに、以下のように viewDidLoad() 等で直接指定しても大丈夫です。

    override func viewDidLoad() {
        super.viewDidLoad()
        
        tableView.estimatedRowHeight = 100  // セルの高さの見積もり
        tableView.rowHeight = UITableViewAutomaticDimension
    }

見積もりの高さ

UITableView では UILabel 等の高さからセルの高さを計算させる必要があるのですが、計算処理が複雑な場合に負荷が大きくなってしまいます。
そこで、見積もりの高さを指定することで、 実際にセルを描画するタイミングまで見積もりの高さを使って計算させ、実際の計算を遅延させることができます。

そのため、この高さの指定は大体で構いません。

注意点

estimatedRowHeight の値を CGFloat.min で指定すると、 iPhone5 等の 32ビットCPU のデバイスではクラッシュしてしまいます。
また、 64ビットCPU のデバイスでも、描写されたセルの個数が指定した数でなかったりすることがあるようなので、 CGFloat.min で指定せずに、マジックナンバーで指定するのがよさそうです。