これは、autolayoutとを使用した私のソリューションtextView.contentSize.height
です。iOS8 Xcode6.3 beta4 でテスト済み。
最後にについて 1 つのキャッチがありsetContentOffset
ます。行数が変更されたときに「間違った contentOffset」アーティファクトを回避するために配置しました。最後の行の下に余分な不要な空白が追加され、制約を変更した直後に元に戻さない限り、見栄えがよくありません。これを理解するのに何時間もかかりました!
// set this up somewhere
let minTextViewHeight: CGFloat = 32
let maxTextViewHeight: CGFloat = 64
func textViewDidChange(textView: UITextView) {
var height = ceil(textView.contentSize.height) // ceil to avoid decimal
if (height < minTextViewHeight + 5) { // min cap, + 5 to avoid tiny height difference at min height
height = minTextViewHeight
}
if (height > maxTextViewHeight) { // max cap
height = maxTextViewHeight
}
if height != textViewHeight.constant { // set when height changed
textViewHeight.constant = height // change the value of NSLayoutConstraint
textView.setContentOffset(CGPointZero, animated: false) // scroll to top to avoid "wrong contentOffset" artefact when line count changes
}
}