Как выделить весь текст, который вы видите в NSTextView?

Мне нужен способ программно выбрать только текст в границах и изменить это при прокрутке окна или изменении границ.

SelectAll не получится. Мне не нужен весь документ. Моя цель — реагировать на любой текст, прокручиваемый в окне, сканировать его на наличие ключевых слов и представлять контекстную информацию во втором окне.


person johnrubythecat    schedule 16.09.2016    source источник
comment
Я открыт для любого подхода, не только того, который я описал. Если и есть способ сделать видимыми в границах только фрагменты строк, то я его не нашел.   -  person johnrubythecat    schedule 16.09.2016
comment
Вы когда-нибудь находили ответ на это?   -  person adev    schedule 09.07.2018


Ответы (1)


Я придумал решение, которое, по общему признанию, является чем-то вроде взлома. Он оценивает начальный и конечный индекс видимого текста, используя смещение содержимого, высоту содержимого и высоту фрейма содержимого textView. Ответ является только оценочным, потому что перенос слов непредсказуем. Результат обычно составляет ±10 символов реального видимого текста. Вы можете компенсировать это, добавив/вычитая буфер из нескольких символов к начальным/конечным смещениям, что гарантирует, что у вас есть подстрока вашего текста textView, которая определенно содержит видимый текст, только с несколькими дополнительными символами в начале и конец.

Я надеюсь, что этот ответ поможет или, по крайней мере, вдохновит вас (или кого-то еще) на поиск решения, которое точно удовлетворит ваши потребности.

class ViewController: UIViewController, UIScrollViewDelegate {

    @IBOutlet weak var textView: UITextView!

    let textViewText = "Here's to the crazy ones. The misfits. The rebels. The trouble-makers. The round pegs in the square holes. The ones who see things differently. They're not fond of rules, and they have no respect for the status-quo. You can quote them, disagree with them, glorify, or vilify them. But the only thing you can't do is ignore them. Because they change things. They push the human race forward. And while some may see them as the crazy ones, we see genius. Because the people who are crazy enough to think they can change the world, are the ones who do."

    override func viewDidLoad() {
        super.viewDidLoad()
        textView.text = textViewText
    }

    func scrollViewDidScroll(scrollView: UIScrollView) {

        let textViewContentHeight = Double(textView.contentSize.height)
        let textViewFrameHeight = Double(textView.frame.size.height)
        let textViewContentOffset = Double(textView.contentOffset.y)
        let textViewCharacterCount = textViewText.characters.count

        let startOffset = Int((textViewContentOffset / textViewContentHeight) * Double(textViewCharacterCount))

        // If the user scrolls quickly to the bottom so that the text is completely off the screen, we don't want to proceed
        if startOffset < textViewCharacterCount {

            let endIndex = Int(((textViewContentOffset + textViewFrameHeight) / textViewContentHeight) * Double(textViewCharacterCount))
            var endOffset = endIndex - textViewCharacterCount

            if endIndex > textViewCharacterCount {
                endOffset = 0
            }

            let visibleString = textViewText.substringWithRange(textViewText.startIndex.advancedBy(startOffset)..<textViewText.endIndex.advancedBy(endOffset))

            print(visibleString)
        }
    }
}
person Austin Wood    schedule 16.09.2016
comment
Я попробую это немедленно. Кроме того: я думаю, что это еще один ответ (NSRange)glyphRangeForBoundingRectWithoutAdditionalLayout:(CGRect)bounds inTextContainer:(NSTextContainer *)container; затем используйте индекс глифа для доступа к диапазону в индексе символов. Я продолжу работу над этим и опубликую, если мне это удастся. Спасибо за вышеизложенное. - person johnrubythecat; 16.09.2016
comment
вот предыдущий пост, представляющий некоторый интерес. stackoverflow.com/questions/16675997/ - person johnrubythecat; 16.09.2016