Я потратил много времени, пытаясь вычислить в реальном времени количество строк для входного TextView (скажем, в поле ввода текста чата), и единственное решение, которое работает в таком случае, это Люк Чейз (по какой-то причине кадр)Подход .height, по-видимому, обновляет только 3-ю или 4-ю букву, введенную в textView, и поэтому не является точной).
Однако, как упомянул комментатор, существует небольшая ошибка, из-за которой сгенерированные пользователем разрывы строк ("\ n" или нажатие на клавишу возврата клавиатуры) не учитываются должным образом.Даже более странно, он только «пропускает» первый такой разрыв строки, все последующие правильно фиксируются (скажем, если вы перейдете на строку 4 раза, она вернет только 3 строки, явно пропустившие первый разрыв строки).
Чтобы обойти эту ошибку, я просто смотрю, записываю первый такой разрыв строки (символ "\ n") и вручную добавляю строку к числу строк, которое возвращает метод gliph.
В коде, который дает:
func offSetTableViewIfNeeded() {
let numberOfGlyphs = textView.layoutManager.numberOfGlyphs
var index : Int = 0
var lineRange = NSRange(location: NSNotFound, length: 0)
var currentNumOfLines : Int = 0
var numberOfParagraphJump : Int = 0
while index < numberOfGlyphs {
textView.layoutManager.lineFragmentRect(forGlyphAt: index, effectiveRange: &lineRange)
index = NSMaxRange(lineRange)
currentNumOfLines += 1
// Observing whether user went to line and if it's the first such line break, accounting for it.
if textView.text.last == "\n", numberOfParagraphJump == 0 {
numberOfParagraphJump = 1
}
}
currentNumOfLines += numberOfParagraphJump
print("Number of lines is:", currentNumOfLines)
Надеюсь, что это поможет другим, кто боролся со сверхъестественным поведением ввода textView (не может понять, почему Apple не предоставляет метод # строки из коробки!).