2016-09-16 5 views
0

Я хотел бы, чтобы программный выбор только текста в границах и иметь это изменение, когда окно прокручивает или изменяет границы.Как выбрать весь текст, который вы видите в NSTextView?

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

+0

Я открыт для любого подхода, а не только того, который я описал. Если есть способ получить только фрагменты строк, видимые в границах, я их не нашел. – johnrubythecat

ответ

0

Я придумал решение, которое, по общему признанию, немного взломало. Он оценивает индекс начала и конца видимого текста, используя смещение содержимого, высоту содержимого и высоту кадрового содержимого 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) 
     } 
    } 
} 
+0

Я попробую его немедленно. Кроме того: я думаю, что это еще один ответ. (NSRange) glyphRangeForBoundingRectWithoutAdditionalLayout: (CGRect) ограничивает контейнер inTextContainer: (NSTextContainer *); затем используйте индекс глифа для доступа к диапазону в символьном индексе Я продолжу работу над этим и опубликую, если мне удастся. Спасибо за вышесказанное. – johnrubythecat

+0

здесь есть какой-то интерес. http://stackoverflow.com/questions/16675997/using-nsglyph-and-memory-allocation – johnrubythecat