2012-05-22 9 views
2

나는 책 레이아웃에 두 개의 NSTextfields을 가지고 있는데, 이전의 '페이지'로 돌아갈 수있는 빠른 방법을 찾지 못했습니다. 책 크기, 글꼴 크기, 줄 크기가 모두 변경되므로 이전 페이지의 텍스트 문자열을 즉시 계산해야합니다. 사진 :북 레이아웃 NSTextFields - 뒷 페이지로 이동 하시겠습니까?

Example

NSTextfields 각각 하나의 NSTextContainer 있고, 그들은 NSLayoutManagerNSTextStorage를 공유 할 수 있습니다.

앞으로가는 것이 쉽습니다. 보이는 텍스트의 문자 범위를 가져 와서 다음 문자부터 시작하여 부분 문자열을 만듭니다.

내 돌아가는 방법은 괴롭다. 한 번에 볼 수있는 최대 문자 수를 파악합니다. 그런 다음 그 길이의 문자열을 만들고 마지막 문자는 책의 오른쪽 하단 모서리에 있습니다. 그 다음 루프 : 시작에서 문자를 제거하고, 원하는 문자가 맨 아래 오른쪽에 나타날 때까지 매번 표시되는 내용을 확인합니다. 이것은 매우, 매우 느립니다.

누구나 내가 원하는 것을 더 빨리 할 수있는 방법을 제안 할 수 있습니까? 내가 scrollRangeToVisible을 사용하는 생각이 있었지만이 레이아웃에 NSScrollView을 설정하는 방법을 알 수 없었습니다.

아무도 도와 줄 수 있습니까?

-(void)setupTextViews { 

articleString = [[NSAttributedString alloc] init]; 
articleStringPortion = [[NSAttributedString alloc] init]; 

bookTextStorage = [[NSTextStorage alloc] init]; 
bookLayoutManager = [[NSLayoutManager alloc] init]; 
[[self bookTextStorage] addLayoutManager:bookLayoutManager]; 

leftColumnRect = NSZeroRect; 
rightColumnRect = NSZeroRect; 

NSDivideRect(bookRect, &leftColumnRect, &rightColumnRect, NSWidth(bookRect)/2, NSMinXEdge); 

// First column 
{ 
    NSTextContainer *textContainer = [[NSTextContainer alloc] initWithContainerSize:leftColumnRect.size]; 
    leftColumnTextView = [[CRMouseOverTextView alloc] initWithFrame:leftColumnRect textContainer:textContainer]; 
    [leftColumnTextView setDrawsBackground:NO]; 
    [leftColumnTextView setEditable:NO]; 
    [leftColumnTextView setup]; 

    [bookView addSubview:leftColumnTextView]; 

    [bookLayoutManager addTextContainer:textContainer]; 

    [textContainer release]; 
    [leftColumnTextView release]; 
} 


// Second column 
{ 
    NSTextContainer *textContainer = [[NSTextContainer alloc] initWithContainerSize:rightColumnRect.size]; 
    rightColumnTextView = [[CRMouseOverTextView alloc] initWithFrame:rightColumnRect textContainer:textContainer]; 
    [rightColumnTextView setDrawsBackground:NO]; 
    [rightColumnTextView setEditable:NO]; 
    [rightColumnTextView setup]; 

    [bookView addSubview:rightColumnTextView]; 

    [bookLayoutManager addTextContainer:textContainer]; 

    [textContainer release]; 
    [rightColumnTextView release]; 
} 

} 

내 끔찍한 거꾸로가는 코드를 게시 아무 소용 없다,하지만 난 할 때마다 눈에 보이는 무엇인지 파악하는 것으로이 방법을 사용하고 있습니다 :

Textcontainers은 다음과 같이 설정되어

-(NSRange)getViewableRange:(NSTextView *)tv { 
NSLayoutManager *lm = [tv layoutManager]; 
NSRect visRect = [tv visibleRect]; 

NSPoint tco = [tv textContainerOrigin]; 
visRect.origin.x -= tco.x; 
visRect.origin.y -= tco.y; 

NSRange glyphRange = [lm glyphRangeForBoundingRect:visRect inTextContainer:[tv textContainer]]; 
NSRange charRange = [lm characterRangeForGlyphRange:glyphRange actualGlyphRange:nil]; 

return charRange; 
} 

답변

0

나는 이것이 당신이 찾고있는 대답인지 확신 할 수 없지만, 나라면, 이전에 보았던 모든 이전 페이지의 문자 범위를 "캐시"했을 것입니다. 페이지가 많은 책을 저장하는 데 문제가 없을 수도 있습니다. 물론, 사용자가 텍스트의 크기를 재조정 할 때 등등을 위해 kludgy 코드를 사용해야합니다. (어느 쪽인지, 또는 적절한 출발점에서부터 다시 계산할 수 있습니다. 책이 충분히 빠르거나 챕터 또는 기타 부분이 시작되면 책의 시작 부분을 말하십시오. 그러면 책을 포함하는 페이지 (범위)를 찾을 수 있습니다. 이미 표시된 텍스트는 이전 텍스트를 표시합니다.)

+0

생각해 줘서 고맙습니다. 이전 페이지 번호 캐싱을 고려한 다음 처음부터 다시 계산합니다. 일반적으로 이것이 최선의 경로라고 생각하지만 책 레이아웃은 언어 학습자를위한 중국어 텍스트를 표시하므로 두 페이지를 통해 검색하여 이전 위치를 찾도록 요청하지는 않을 것입니다. 왼쪽 텍스트 상수). 왼쪽 상단 텍스트의 위치를 ​​변경하면 강조 표시됩니다. 이 문제의 한 가지 문제점은 사용자가 책/텍스트/줄 간격 조정을 마친 시점을 파악하여 다시 계산할 수 있다는 것입니다. 도와 주셔서 감사합니다! – Byzanti