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

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

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

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

Q&A

1回答

2866閲覧

【Swift4】textViewを可変にしたい

nakamu

総合スコア82

Swift

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

0グッド

1クリップ

投稿2019/04/07 07:31

編集2019/04/07 10:59

参照1
参照2

イメージ説明
イメージ説明

可変になるものとならないものがある
1番最初の長文だけ長くなるが、それ以降のは全て1行になってしまう
イメージ説明
イメージ説明

なぜか隙間があく
イメージ説明

謎です。

Swift

1 func tableView(_ table: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 2 // セル生成 3 let cell = table.dequeueReusableCell(withIdentifier: "chatCell", for: indexPath) as! ChatTableViewCell 4 let text = cell.viewWithTag(3) as! UITextView 5 6 // paddingを消す 7 text.textContainerInset = UIEdgeInsets.zero 8 text.textContainer.lineFragmentPadding = 0 9 text.text = (messageArr[indexPath.row]["message"] as! String) 10 11 12 // これではできないのか? 13 text.delegate = self 14 let height = text.sizeThatFits(CGSize(width: text.frame.size.width, height: CGFloat.greatestFiniteMagnitude)).height 15 text.heightAnchor.constraint(equalToConstant: height).isActive = true 16 17 return cell 18 } 19// コメントアウト外すと全て1行になります 20 //func tableView(_ table: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat { 21 // return 49 22 //} 23 24 func tableView(_ tableView: UITableView, estimatedHeightForRowAt indexPath: IndexPath) -> CGFloat { 25 return 49 //自動設定 26 }

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

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

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

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

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

guest

回答1

0

たくさん脱線したので、そもそもの回答を書き直します。
「tableview cell textview」でググると一番に出てくる
https://qiita.com/mishimay/items/619f9ce60b4fabc1612f
が参考になります。

自分もこの通りにやっています。
自分のは文字を入力できるようにしていますが、
入力を保存して、tableviewをreloadしても
各行が入力文字に対応した大きさにきちんとなるので、
読み込んで表示するだけにも応用できると思います。

参考にして下さい。
参照ページにはdelegateの設定は省かれてますが、
入力系をOnにするのなら、delegateは必要となります。

〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜
以下は脱線したこれまでの内容のまとめとなります。
・delegateの設定を忘れずに
・textViewにカスタムセルで固定のtag番号をつけてはダメ
・textViewのtagはカスタムセルで設定せずに、呼び出すviewcontrollerで設定を
・textViewはカスタムセルでは@IBOutletで繋ぐと楽
・tableviewのheightForRowAt/estimatedHeightForRowAtの設定は不要

となります。よろしくお願いします。

投稿2019/04/07 10:44

編集2019/04/07 15:06
hameji001

総合スコア639

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

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

nakamu

2019/04/07 11:01

let text = cell.viewWithTag(3) as! UITextView 記入漏れあったので追加しました カスタムクラスにUITextViewDelegateの継承しました。 viewcontroller側でもUITextViewDelegate継承しますか?
hameji001

2019/04/07 11:25

cell.textView.delegate = selfとするので、 self(viewcontroller)にもdelegateを継承しないといけません。
nakamu

2019/04/07 11:52

継承しました タグでインスタンス生成してるので cell.textView.delegate = self ではなく、 text.delegate = self しましたが同じように最初だけ可変であとは1行です コメントアウトの箇所ってどうしてますか?
hameji001

2019/04/07 12:07 編集

見ましたが、tagを3(固定値)に指定しているのはよくないです。 cellは必要あらば複製されますが、 上記のコードだと、tableViewに表示されているcellのtextViewが全部tag3になってしまいます。 通常は@IBoutletで繋いで、名前をつけてはどうでしょうか? cellはreuseされること、取得する必要がある事も考慮し、 viewcontroller側でindexPathを使用して、 tagをつけ直した方がいいと思います。 自分はtag = (indexPath.row+1)*100としています。 ちなみにtextとつけると、text.textとどっちがどっちのことかわかりずらくなるので、 textViewやtViewなどせめて違うものにした方が可読性があがりますし、 検索する時にも便利になりますよ。
hameji001

2019/04/07 12:21 編集

コメントアウトに関して答えてませんでした。 何処かのサイトで調べた方法で自分はやってますが、 コメントアウトの heightForRowAtや記述のある estimatedHeightForRowAt indexPath: IndexPath) は設定しておりません。 viewDidLoad内に下記の2行を追加し、 self.tableView.rowHeight = UITableView.automaticDimension self.tableView.estimatedRowHeight = 100000 あとは、カスタムcellのtextViewのautolayoutを きちんと設定してあれば大丈夫なはずです。 最後に書いたこのコメントが一番重要な点をついてると思います。 delegateはtextViewを使う時の機能としては大事ですが、 他は蛇足だと思ってください。
nakamu

2019/04/11 07:32

1行になります
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問