2

일부 텍스트 분석을 수행하고 있으며 성가신 성능이 뛰어나서 최적화 방법을 찾지 못하는 것 같습니다. UITextView의 텍스트로 시작하여 텍스트를 ".?!"의 문자로 분할하여 문장의 배열로 나눕니다.UITextView에서 문장 주위에 CGPath를 작성하는 것은 -positionFromPosition에서 매우 느립니다.

그런 다음 각 문장을 반복하여 문장을 단어 배열로 분할하고 문장의 첫 번째 단어와 마지막 단어를 가져옵니다. 문장 텍스트의 NSRange를 사용하여 UITextView의 텍스트에서 첫 번째와 마지막 단어의 범위를 찾습니다.

다음 부분은 성능 저하가 발생한 부분입니다. 이것은 내가 처음이자 마지막 단어의 경계 CGRect을 찾는 방법입니다 :

// the from range is increased each iteration 
// so i'm not searching the entirety of the text each pass 
NSRange range = [textView.text rangeOfString:firstWord options:kNilOptions range:fromRange]; 

UITextPosition *beginning = textView.beginningOfDocument; 
UITextPosition *start = [textView positionFromPosition:beginning offset:range.location]; 
UITextPosition *end = [textView positionFromPosition:start offset:range.length]; 
UITextRange *textRange = [textView textRangeFromPosition:start toPosition:end]; 

firstRect = [textView firstRectForRange:textRange]; 

내가 한 번 첫 번째 단어를 한 번 마지막 단어를 두 번을이 을 수행합니다.

이 방법은 작은 텍스트에서는 효과가 있지만 5 개 이상의 단락에 접근하면 UITextView -positionFromPosition : 작업이 492ms의 시간을 소비하여 UI와 CPU를 100 %로 고정시킵니다.

CGACect를 작성하여 문장을 강조 할 수 있도록해야합니다. 전체가 작동하고 정말 멋져 보이지만, 그 직사각형이 발견되면서 나를 죽이고 있습니다. 나는 UITextView를 사용하는 것에 상당히 익숙하다. 그래서 만약 내가 할 수있는 일이 있다면, 범위를 가지고 내 검색을 최적화하거나 어떻게 든 백그라운드 스레드에 내 작업을 배치하면, 나는 많은 의무를지게 될 것이다.

+1

나는 이것이 대답이 아니라는 것을 알고있다. 그러나 나는 당신이 그 직사각형을 필요로하는지 궁금하다. 텍스트 범위를 강조 표시하는 경우, UITextView에서 iOS 6의 새로운 NSAttributedString 메소드를 사용하여 주어진 범위를 강조 표시 할 수 있습니다. – jbrennan

+0

답변으로 게시해야합니다! 디버깅 및 연구 시간을 절약 해 줬습니다. UITextViews가 NSAttributedStrings를 사용한다는 것을 완전히 잊었습니다! 100 LoC에서 15까지. 딸꾹질없이 GCD를 사용할 수 있습니다. Ahh 내 인생은 훨씬 낫다. – rnystrom

답변

1

UITextViewattributedText 속성은 NSAttributedString을 사용하는 것이 더 나을 것입니다. 이를 통해 NSBackgroundColorAttributeName을 특정 범위의 색상으로 설정할 수 있습니다.

속성있는 텍스트 방법은 iOS 6 이상에서만 작동합니다.

+0

텍스트에 특성을 추가하기 위해 UITextView.text를 프로그래밍 방식으로 수정하면이 텍스트 뷰에 대한 기본 제공 UNDO가 비활성화됩니다. – Kibernetik