2016-09-06 2 views
2

В приложении Swift, которое я создаю, пользователь может ввести текст в текстовое представление, а затем выполнить поиск определенной строки внутри него, как и в Pages (и многих других).Прокрутите до определенной части UITextView в Swift

У меня есть index символа, который они ищут как целое (т. Е. Они находятся на третьем экземпляре «привет» в массивном текстовом блоке, который они набрали, и я знаю, что это 779-я буква текста view), и я пытаюсь автоматически прокручивать текстовое представление до строки, в которой они находятся, так что она выскакивает (как в Pages).

Я пытаюсь перейти к применимой строке с этой командой:

self.textview.scrollRangeToVisible(NSMakeRange(index, 0)) 

, но она никогда не прыгает в нужном месте (иногда слишком далеко вниз, иногда слишком далеко вверх), часто в зависимости от размера экрана , поэтому я знаю, что index не принадлежит прямо там.

Как я могу правильно разрешить пользователю переходить к определенной строке в текстовом виде, заставляя текстовое представление прокручиваться до определенного символа?

ответ

2

Вы можете получить строку, которая перед индексом 779, а затем вычислить высоту этой строки, а затем прокрутить до этой точки.

let string = textView.text.substringWithRange(Range<String.Index>(start: textView.text.startIndex, end: textView.text.startIndex.advancedBy(779)))// your <779 string 
let size = string.sizeWithAttributes([NSFontAttributeName:yourFont]) 
let point = CGPointMake(0, size.height) 
scrollView.setContentOffset(point, animated:true) 
+0

Спасибо за ваш ответ! Одна проблема: в первой строке я получаю 'Не могу вызвать инициализатор для типа 'Range ' с аргументом списка типа '(start: Index, end: String.CharacterView.Index)''. Я должен отметить, что я использую Swift 3. – owlswipe

+0

@JohnRamos просто попробуй буквально, а вместо Range используйте что-то вроде textView.text.startIndex ..

+0

Нет 'advancedBy' в Swift 3 !! – owlswipe