актуально для 2019
Это одна из самых глупых ошибок в 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 "extra space at the 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
в UITextViewFixed
.
Однако ... верьте или нет ... это просто не работает в текущей iOS! (Проверено в 2019.) Возможно, потребуется добавить эту строку в будущем.
Тот факт, что UITextView
не работает в iOS, является одной из самых странных вещей во всех мобильных вычислениях. Десятилетие этого вопроса, и он до сих пор не решен!
Наконец, вот несколько похожий совет для текста Поле : https://stackoverflow.com/a/43099816/294884