UITextViewの高さを中身によって変える場合、ポイントは2つある。
- 最初に上下左右の制限をつける
- スクロールを不可にする
UITextViewの上下左右にAuto Layoutを設定する。どれか一つでも欠けるとたぶんうまくいかない。
続いてisScrollEnabled = falseをつける。Swift 4ではisScrollEnabledだ。scrollEnabledではない。
sizeToFit、contentSize.heightなどはまったく関係ない。constraint(equalToConstant: height).isActive = trueと高さを直接指定することも解決にならない。
上下左右のすべてに制限をつけて、その後でスクロールを不可にする。スクロールを不可にしてから上下左右に制限をつけてもうまくいかない。
マージン(パディング)をさらに設定する
実際はマージンを設定することが多い。マージンは
v.textContainerInset = UIEdgeInsets(top: 24, left: 24, bottom: 24, right: 24)
などと設定する(vはUITextViewのこと)。つまりUITextViewをマージンつきで高さを可変にしたいときは
- 最初に上下左右の制限をつける
- スクロールを不可にする
- textContainerInsetをUIEdgeInsetsで設定する
とする。
追記
上下左右の制限をつけて、スクロールを不可にすると、UITextViewの高さが決定する。つまり高さを取得できるようになる。
オートレイアウトなしで高さを設定したいときは、たぶんcontentSizeあたりで高さを設定できる。かもしれない。