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

tomoyaonishiのブログ

iOSのことを中心に・・・その他もあるよ!

UITableViewCellの高さを自動で計算する: UITableViewAutomaticDimension

UITableViewCellのUITableViewAutomaticDimensionを使えば、セルのそれぞれの高さを自動で計算させることができます。

    optional func tableView(tableView: UITableView, heightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat

こいつとはおさらばです。

以下実装方法です。


まず通常のUITableViewの実装の方法でStoryboardを作っていきます。 カスタムセルに対してUILabelを1つ置きます。ここで以下の画像のようにセル全体にLabelが広がるようにAutoLayoutを設定します。なお、カスタムセルではなくBasicStyleのセルであればここでは何もしなくてもよいです。

f:id:tomoyaonishi:20140927160105p:plain

次にカスタムセル、BasicStyleのセルであったとしても以下のようにLabelのlineプロパティを0にして複数行入るように変更します。

f:id:tomoyaonishi:20140927160113p:plain

後はViewController側で以下のようなソースコードを書きます。

class ViewController: UIViewController, UITableViewDataSource {

    @IBOutlet weak var tableView: UITableView!
    
    
    let phrases: [String] =
    [
        "やっほー",
        "すげええええええええええええええええええええええええええええええええええええええええええええええええええええええええええ",
        "TableViewCellが自動でセルの高さを計算しています!!!!!!!!!!!!!",
        "\n\n\n\n\nホントです。",
    ]

    
    // MARK: Life cycle
    
    
    override func viewDidLoad() {
        super.viewDidLoad()
        self.tableView.estimatedRowHeight = 100.0
        self.tableView.rowHeight = UITableViewAutomaticDimension
    }
    
    
    override func viewDidAppear(animated: Bool) {
        super.viewDidAppear(animated)
        self.tableView.reloadData()
    }

    
    // MARK: UITableViewDataSource
    
    
    func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        
        return self.phrases.count
    }
    
    
    func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCellWithIdentifier("Cell") as MyTableViewCell
        cell.label.text = self.phrases[indexPath.row]
        
        return cell
    }
    
}

これで実行するとセルの高さが自動で計算されてTableViewが表示されます。

f:id:tomoyaonishi:20140927161107p:plain

サブビューが2つ以上ある場合でもAutoLayoutをうまく貼れば自動で計算されます。 iOS8, Xcode6で試しました。