Почему CharacterRange(at: .zero) == ноль?

У меня есть UITextView с некоторым текстом, который выходит за его пределы. Таким образом, вертикальная прокрутка включена.

Теперь я хочу найти позицию первого видимого персонажа. Вот что я попробовал:

let firstCharacterPosition = characterRange(at: contentOffset)?.start

Это работает в большинстве случаев. Однако, когда я прокручиваю вверх и приближаюсь к началу текста, characterRange(at:) функция неожиданно возвращается nil,

В начале я думал, что это только из-за подпрыгивания (когда contentOffset.y значение вскоре становится < 0). Но это не единственная причина.

Я попробовал некоторые другие значения и с удивлением обнаружил, что

characterRange(at: .zero)

возвращается nil а также - как текстовые позиции с низким положительным y значение.

Это почему?

Как я могу получить надежный UITextPosition для первого видимого символа?

2 ответа

Пожалуйста, попробуйте этот код (удалить textView если вы звоните внутри UITextView подкласс):

let firstVisibleCharacterIndex = textView.layoutManager.characterIndex(for: textView.contentOffset, in: textView.textContainer, fractionOfDistanceBetweenInsertionPoints: nil)

Я думаю, что это может помочь вам.

if let selectedRange = textField.selectedTextRange {
    let firstCharacterPosition = textField.offset(from:textField.beginningOfDocument,to:selectedRange.start) 
}
Другие вопросы по тегам