【Swift】セルとLabelを動的に可変させる方法

LINEのようなチャットアプリを作る際、どうやってあの吹き出しを実装するかが問題。

(チャットアプリを作る際、とても苦労しました。)

 

動的に可変とは、LINEのメッセージみたいに、入力された内容に応じてLabelの大きさを変化させること。

 

つまり、その時々に応じて、柔軟にLabelを可変させること。

 

ただLabelを表示させるならまだいいが、セル内でLabelを可変させるのは考えただけでも難しい。

 

でも、意外と簡単なんだよ。

 

とりあえず、説明していく。

 

完成図

 

f:id:nekokichi_yos2:20181108230245p:plain

 

ストーリーボード

 

f:id:nekokichi_yos2:20181108230312p:plain

f:id:nekokichi_yos2:20181108230306p:plain

 

コード

 

import UIKit

class ViewController: UIViewController,UITableViewDelegate,UITableViewDataSource {
    
    @IBOutlet weak var tableView: UITableView!
    @IBOutlet weak var textField: UITextField!
    
    //セルに表示するテキストを格納した配列
    var array = [String]()
    
    func numberOfSections(in tableView: UITableView) -> Int {
        return 1
    }

    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return array.count
    }
    
    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath)
        
        //labelを生成
        let label = cell.viewWithTag(1) as! UILabel
        //labelの行を無制限に
        label.numberOfLines = 0
        //labelに角丸をつける
        label.layer.cornerRadius = 5.0
        label.clipsToBounds = true
        //labelにテキストを代入
        label.text = array[indexPath.row]
        
        return cell
    }
    
    @IBAction func button(_ sender: Any) {
        //入力したテキストを配列に格納
        array.append(textField.text!)
        //セルをリロード
        tableView.reloadData()
    }

}

 

注意

 

Labelに必要な制約は、

  • 上(top)
  • 下(bottom)
  • 右(right)
  • 左(left)
  • 幅(width)

の5つ。

 

そして、Labelの下にある設定を施す。

  • ユーティリティ - 左から4つ目 - Relation

  • Equal → Greater Than or Equal

に変更。

 

上記を設定しないと、動的に可変しないので注意。