나는 책 레이아웃에 두 개의 NSTextfields
을 가지고 있는데, 이전의 '페이지'로 돌아갈 수있는 빠른 방법을 찾지 못했습니다. 책 크기, 글꼴 크기, 줄 크기가 모두 변경되므로 이전 페이지의 텍스트 문자열을 즉시 계산해야합니다. 사진 :북 레이아웃 NSTextFields - 뒷 페이지로 이동 하시겠습니까?
NSTextfields 각각 하나의 NSTextContainer
있고, 그들은 NSLayoutManager
및 NSTextStorage
를 공유 할 수 있습니다.
앞으로가는 것이 쉽습니다. 보이는 텍스트의 문자 범위를 가져 와서 다음 문자부터 시작하여 부분 문자열을 만듭니다.
내 돌아가는 방법은 괴롭다. 한 번에 볼 수있는 최대 문자 수를 파악합니다. 그런 다음 그 길이의 문자열을 만들고 마지막 문자는 책의 오른쪽 하단 모서리에 있습니다. 그 다음 루프 : 시작에서 문자를 제거하고, 원하는 문자가 맨 아래 오른쪽에 나타날 때까지 매번 표시되는 내용을 확인합니다. 이것은 매우, 매우 느립니다.
누구나 내가 원하는 것을 더 빨리 할 수있는 방법을 제안 할 수 있습니까? 내가 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;
}
생각해 줘서 고맙습니다. 이전 페이지 번호 캐싱을 고려한 다음 처음부터 다시 계산합니다. 일반적으로 이것이 최선의 경로라고 생각하지만 책 레이아웃은 언어 학습자를위한 중국어 텍스트를 표시하므로 두 페이지를 통해 검색하여 이전 위치를 찾도록 요청하지는 않을 것입니다. 왼쪽 텍스트 상수). 왼쪽 상단 텍스트의 위치를 변경하면 강조 표시됩니다. 이 문제의 한 가지 문제점은 사용자가 책/텍스트/줄 간격 조정을 마친 시점을 파악하여 다시 계산할 수 있다는 것입니다. 도와 주셔서 감사합니다! – Byzanti