UITextViewのsizeThatFitsを利用した際に値が想定したものでなかった
UITextViewを行数に応じて、高さを可変にしたかったので「sizeThatFits」を利用して、UITextViewのサイズを取得して調整していました。
※sizeThatFitsは指定したサイズに応じて、最適なサイズを計算して返してくれるものらしいです。
ある時から、一定文字数の場合のみサイズが適切でない事がわかりました。
例えば、4文字までで改行すれば問題ないが、5文字以上で改行すると、高さの計算がおかしい・・・
のような状態になりました。
UITextViewにcontentInsetを設定していた
ある時から・・・というのは、UITextViewにcontentInsetを指定した時から高さがおかしくなっていたようです。
lazy var inputNameView: UITextView = {
let inputNameView = UITextView()
inputNameView.delegate = self
inputNameView.layer.borderColor = UIColor.gray.cgColor
inputNameView.layer.borderWidth = 1
inputNameView.layer.cornerRadius = 8
inputNameView.contentInset = .init(top: 0, left: 0, bottom: 0, right: 32)
return inputNameView
}()
このように右側にスペースを設けるために、contentInsetを指定していました。
この指定を行っていると、高さの計算が想定していたものではない事に気付きました。
解決した方法
sizeThatFitsで指定したサイズで計算が想定したものと違ったのが、contentInsetを指定してからだったので、contentInsetで指定したサイズを考慮すべきなのだと思います。
今回指定したcontentInsetのrightで指定した値の分を足して計算する事にしました。
extension ViewController: UITextViewDelegate {
func textViewDidChange(_ textView: UITextView) {
let width = textView.frame.width + 32
let size = textView.sizeThatFits(CGSize(width: width, height: CGFloat(100)))
}
}
この指定をする事で想定した動作をするようになりました。
ひょっとしたら、枠線や他のサイズについても考慮する必要があるかもしれませんが、今回の場合はこの指定だけで、解決しました。
コメント