9

나는 응용 프로그램의 텍스트 편집기로 작업 중입니다. UITextView를 사용하고 있습니다.큰 NSAttributedString을 사용하는 UItextView의 스크롤링 성능 문제

텍스트보기를로드하려면 샘플 코드를 참조하십시오.

// Read text from file (around 300k - 400k words) 
NSError *error = nil; 
NSString *contentOfFile = [[NSString alloc] initWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"17254" ofType:@"txt"] 
                  encoding:NSUTF8StringEncoding 
                  error:&error]; 

// Attributes for text 
UIFont *font = [UIFont fontWithName:@"Baskerville" size:36.0f]; 
NSMutableParagraphStyle *paragraphStyle = [[NSMutableParagraphStyle alloc] init]; 
paragraphStyle.alignment = NSTextAlignmentJustified; 

NSDictionary *attributes = [[NSDictionary alloc] initWithObjectsAndKeys:font, NSFontAttributeName, 
          [UIColor blackColor], NSForegroundColorAttributeName, 
          paragraphStyle, NSParagraphStyleAttributeName, nil]; 


// Create attributed string 
NSAttributedString *attributedString = [[NSAttributedString alloc] initWithString:contentOfFile attributes:attributes]; 

// Assign to text view 
self.textView.attributedText = attributedString; 

텍스트의 크기는 약 400k 단어입니다.

다음과 같은 문제가 있습니다.

  • 메모리 스크롤로 인해 텍스트가 너무 느리게 스크롤되거나 앱이 다운되는 경우가 있습니다. iOS는 텍스트 뷰를 스크롤 할 때 iOS가 렌더링 된 텍스트 이미지를 메모리에 저장하고 있다고 생각하지만, 위로 스크롤하면 메모리가 해제됩니다.

  • "모두 선택"을 탭하면 텍스트를 선택하는 데 너무 많은 시간이 걸리고 텍스트를 선택한 후에 스크롤이 좋지 않게되고 메모리가 증가하여 메모리 문제로 인해 응용 프로그램이 충돌하는 경우가 있습니다. 나는 iOS가 완전한 텍스트의 이미지 (마치 사용자가 볼 수있는 것처럼)를 메모리에 생성 한 다음 전체 텍스트를 선택하고 선택이 완료 될 때까지 이미지를 유지한다고 생각한다. 선택이 끝나면 앱에 의해 유지 된 메모리가 떨어집니다.

큰 텍스트를 표시하는 다른 방법은 여러 textviews를 사용하고 단지 jQuery과 같은 눈에 보이는 텍스트 뷰의 텍스트를 지정하는 것입니다,하지만 난 각에 필요한 textviews의 수를 재 계산해야으로이 복잡성을 증가 UItextView의 layoutManager에 대한 textChanged 대리자 호출입니다.

어떤 몸이라도 UITextView에서 큰 속성의 텍스트를 더 나은 성능으로 표시하는 방법을 알고 있습니다.

어떤 것도 iPages 앱이 작동하는 방식입니다. 영역이 보이는 범위에있을 때 텍스트가 표시되기 때문입니다.

+1

페이지는 완전한 사용자 정의보기를 사용합니다 ... 텍스트를 표시하는 경우에는 'UIWebView'를 사용할 수 있습니다 ... 서식을 지정하기 위해 일부 HTML 태그에 텍스트를 래핑 한 다음 그 모양으로 표시합니다. – jjv360

+0

편집자. 사용자는 글꼴, 색 및 정렬을 편집 할 수 있습니다. 페이지 나누기 및 기타 옵션을 추가 할 수 있습니다. –

답변

1

전체 텍스트를 직접로드하지 않아야합니다. 텍스트 뷰 용량의 두 배인 텍스트를로드해야합니다.

이제 스크롤 이벤트를 추적하고 문자열을 동적으로 수정하십시오.

+1

동일한 문제가 있습니다. 답변을 더 구체적으로 지정할 수 있습니다. –