【Swift】セルとLabelを動的に可変させる方法
LINEのようなチャットアプリを作る際、どうやってあの吹き出しを実装するかが問題。
(チャットアプリを作る際、とても苦労しました。)
動的に可変とは、LINEのメッセージみたいに、入力された内容に応じてLabelの大きさを変化させること。
つまり、その時々に応じて、柔軟にLabelを可変させること。
ただLabelを表示させるならまだいいが、セル内でLabelを可変させるのは考えただけでも難しい。
でも、意外と簡単なんだよ。
とりあえず、説明していく。
完成図
ストーリーボード
コード
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
に変更。
上記を設定しないと、動的に可変しないので注意。