на 2018 год
Это одна из самых глупых ошибок в iOS.
UITextViewFixed
обычно является разумным решением:
@IBDesignable class UITextViewFixed: UITextView {
override func layoutSubviews() {
super.layoutSubviews()
setup()
}
func setup() {
textContainerInset = UIEdgeInsets.zero
textContainer.lineFragmentPadding = 0
}
}
Не забудьте отключить scrollEnabled в Инспекторе!
Это решение работает правильно как в раскадровке, так и во время выполнения.
Вот и все, все готово.
В общем, , который должен быть всем, что вам нужно в большинстве случаев .
(Даже если вы изменяете высоту текстового представления на лету - например, когда пользователь вводит текст - обычно это делает все, что вам нужно. )
Вот сломанный UITextView от Apple. , ,

Почти во всех случаях UITextViewFixed
является приемлемым исправлением:

(желтый добавлен для ясности. ) Обратите внимание, что, конечно, вы должны
отключить scrollEnabled в Инспекторе!
Не забудьте отключить scrollEnabled! :)
Некоторые дальнейшие проблемы
(1) В некоторых случаях - например, иногда при использовании автоматического размещения с гибкими представлениями таблицы высоты ячеек, которые меняют высоту на лету - Apple делает самую яркую вещь в мире: они добавляют дополнительное пространство внизу . Это должно быть одной из самых безумных, самых ярых вещей в iOS. Вот "быстрое исправление", чтобы добавить, что иногда помогает с этим безумием.
...
textContainerInset = UIEdgeInsets.zero
textContainer.lineFragmentPadding = 0
// this is not ideal, but you can sometimes use this
// to fix the "space at bottom" insanity
var b = bounds
let h = sizeThatFits(CGSize(
width: bounds.size.width,
height: CGFloat.greatestFiniteMagnitude)
).height
b.size.height = h
bounds = b
...
(2) Иногда, чтобы исправить еще одну тонкую ошибку Apple, вы должны добавить это:
override func setContentOffset(_ contentOffset: CGPoint, animated: Bool) {
super.setContentOffset(contentOffset, animated: false)
}
(3) Возможно, мы должны добавить:
contentInset = UIEdgeInsets.zero
сразу после .lineFragmentPadding = 0
. Тем не мение . , , это не работает в текущей iOS! Возможно, потребуется добавить это в будущих версиях ОС.
Тот факт, что UITextView
из всех вещей полностью сломан в iOS, является лишь одной из самых странных вещей во всех мобильных вычислениях.
Наконец, вот несколько похожий совет для Text Поле : https: // stackoverflow. com / a / 43099816/294884