質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
iOS

iOSとは、Apple製のスマートフォンであるiPhoneやタブレット端末のiPadに搭載しているオペレーションシステム(OS)です。その他にもiPod touch・Apple TVにも搭載されています。

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

Q&A

解決済

2回答

2318閲覧

コードからautolayoutを使った際、tableViewのセルの高さを可変にする

KazutakaShimizu

総合スコア157

iOS

iOSとは、Apple製のスマートフォンであるiPhoneやタブレット端末のiPadに搭載しているオペレーションシステム(OS)です。その他にもiPod touch・Apple TVにも搭載されています。

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

0グッド

0クリップ

投稿2017/01/24 01:24

編集2017/01/24 12:33

現在iosアプリを制作しているのですが、autolayoutをtableViewのセルによって動的に変更したく、SnapKitを使ってコードから設定しています。
autolayout自体はきちんと設定できているのですが、セルの高さが可変にならず、セル内の要素がセルからはみだしてしまいます。

tableViewの設定は下記です。

swift

1import UIKit 2 3class ViewController: UIViewController { 4 @IBOutlet var tableView: UITableView! 5 var datas = [true, false, true, false, false] 6 7 override func viewDidLoad() { 8 super.viewDidLoad() 9 tableView.delegate = self 10 tableView.dataSource = self 11 let nib = UINib(nibName: "TableViewCell", bundle: nil) 12 tableView.register(nib, forCellReuseIdentifier: "Cell") 13 tableView.estimatedRowHeight = 350 14 tableView.rowHeight = UITableViewAutomaticDimension 15 16 } 17 18 private func createData() -> [Bool]{ 19 let datas = [true, false, true, false, false] 20 return datas 21 } 22} 23 24extension ViewController: UITableViewDelegate, UITableViewDataSource { 25 func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 26 return datas.count 27 } 28 29 func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 30 var cell = tableView.dequeueReusableCell(withIdentifier: "Cell", for: indexPath) as! TableViewCell 31 print(datas[indexPath.row]) 32 cell.data = datas[indexPath.row] 33 return cell 34 } 35}

セル内でのautolayoutの設定は下記です.

swift

1 var data: Bool? { 2 didSet{ 3 guard let data = data else { return } 4 self.setUpUI(data: data) 5 } 6 } 7 8 private func setUpUI(data:Bool){ 9 if data == true { 10 label.backgroundColor = .blue 11 label.snp.makeConstraints({ (make) -> Void in 12 make.top.equalTo(10) 13 make.bottom.equalTo(10) 14 }) 15 }else{ 16 label.backgroundColor = .red 17 label.snp.makeConstraints({ (make) -> Void in 18 make.top.equalTo(100) 19 make.bottom.equalTo(100) 20 }) 21 } 22 }

tableViewの設定を上記のまま、autoLayoutをstoryBoardから設定するときちんとセルの高さが可変になります。

どなたか原因のわかる方、ご教授よろしくおねがいいたします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

fuzzball

2017/01/24 02:28

どういう制約を付けたいのでしょうか?
KazutakaShimizu

2017/01/24 03:42

dataがtrueの場合はlabelの上下にセルの上端、下端から10pxの制約を、falseの場合は100pxの制約をつけたいです。
fuzzball

2017/01/24 03:59

setUpUI()は、どこで、どういうタイミングで呼んでいるのでしょうか?
KazutakaShimizu

2017/01/24 04:01

このセルの中にdataという変数があるのですが、didSetを使ってそこに値がセットされた段階で呼んでいます。
KazutakaShimizu

2017/01/24 04:03

質問を編集して上記の部分も含めたので、ご査証ください
fuzzball

2017/01/24 04:08 編集

答えになっていませんが‥。dataへの値のセットは、どこで、どういうタイミングで行われているのでしょうか?
KazutakaShimizu

2017/01/24 12:34

失礼いたしました。質問を編集しましたのでご覧いただけますでしょうか。
guest

回答2

0

自己解決

autolayoutを使わず、セルの高さを中の要素に合わせて逐一計算して設定するようにしました。

投稿2017/02/16 02:01

KazutakaShimizu

総合スコア157

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

親子関係の制約を付けるときは親の方に制約を付けないといけませんので、contentViewに対して制約を付けます。

swift

1contentView.snp.makeConstraints({ (make) -> Void in 2 make.top.equalTo(label).offset(-10) //or -100 3 make.bottom.equalTo(label).offset(10) //or 100 4}

これで縦方向に関しては大丈夫じゃないかと思うのですが。

投稿2017/01/24 02:49

編集2017/01/26 01:19
fuzzball

総合スコア16731

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

KazutakaShimizu

2017/01/24 02:56

回答ありがとうございます。 autolayoutは、設定する前と設定した後でlabelの位置が変化したので、設定できてるのかなと思っておりました・・・。 可変にならないというのは、セルのサイズが変わらず、セルからlabelが飛び出して表示されてしまうという状態でございます。
fuzzball

2017/01/24 02:58

位置は変わるけどサイズが変わらないということでしょうか? あと、質問の方にも質問しているので回答をお願いします。
fuzzball

2017/01/24 03:02

回答を書き直しました。
fuzzball

2017/01/24 03:35

勘違いしていたので回答を一旦削除しました。 追記依頼への回答をお願いします。
fuzzball

2017/01/26 01:20 編集

回答を更新しました。 質問ですが、labelはxib上に配置しているのでしょうか?xib上での制約はどうなっているのでしょうか?
KazutakaShimizu

2017/02/16 02:00

返答遅くなってしまい大変申し訳ございません。 恐縮なのですが、自己解決いたしました。 いつも僕の質問にご回答いただき、ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問