在 UITextView 中使用 NSTextContainer/NSLayoutManager 时文本出现乱码
Text garbled when using NSTextContainer/NSLayoutManager with UITextView
我正在实施分页文本,因此我正在使用 NSLayoutManager 和 NSTextContainer 为每个页面创建 UITextView。分页工作正常,但文本出现乱码。在 vanilla UITextView 上设置相同的 NSTextStorage 时,它看起来是正确的:
// In the class that creates the pages
...
self.textStorage = [[NSTextStorage alloc] initWithString:string attributes:@{}];
self.layoutManager.textStorage = self.textStorage;
....
- (void)createPages{
// Remove all current text containers
while (self.layoutManager.textContainers.count > 0){
[self.layoutManager removeTextContainerAtIndex:0];
}
NSMutableArray *textContainers = [NSMutableArray array];
NSUInteger lastRenderedGlyph = 0;
while (lastRenderedGlyph < self.layoutManager.numberOfGlyphs){
NSTextContainer *textContainer = [[NSTextContainer alloc] initWithSize:self.pageSize];
[self.layoutManager addTextContainer:textContainer];
[textContainers addObject:textContainer];
[self addDummyContainersForNewlinesAfterContainer:textContainer];
NSRange range = [self.layoutManager glyphRangeForTextContainer:textContainer];
lastRenderedGlyph = NSMaxRange(range);
}
self.textContainers = textContainers;
}
// In my ViewController
- (void)addTextViews{
self.scrollView = [[UIScrollView alloc] initWithFrame:self.view.bounds];
self.scrollView.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight;
self.scrollView.backgroundColor = [UIColor lightGrayColor];
[self.view addSubview:self.scrollView];
CGFloat xOffset = 0;
// Option #1 - This results in garbled text
for (NSTextContainer *textContainer in self.coordinator.textContainers){
break;
CGRect frame = CGRectMake(xOffset, 0, self.coordinator.pageSize.width, self.coordinator.pageSize.height);
xOffset = CGRectGetMaxX(frame)+1;
self.scrollView.contentSize = CGSizeMake(xOffset, self.coordinator.pageSize.width);
UITextView *textView = [[UITextView alloc] initWithFrame:frame textContainer:textContainer];
textView.attributedText = self.coordinator.textStorage;
[self.scrollView addSubview:textView];
}
// Option #2 - This does not result in garbled text
UITextView *textView = [[UITextView alloc] initWithFrame:self.view.bounds];
[self.view addSubview:textView];
textView.attributedText = self.coordinator.textStorage;
}
原来忘记加了
[self.textStorage addLayoutManager:self.layoutManager];
这解决了问题。
我正在实施分页文本,因此我正在使用 NSLayoutManager 和 NSTextContainer 为每个页面创建 UITextView。分页工作正常,但文本出现乱码。在 vanilla UITextView 上设置相同的 NSTextStorage 时,它看起来是正确的:
// In the class that creates the pages
...
self.textStorage = [[NSTextStorage alloc] initWithString:string attributes:@{}];
self.layoutManager.textStorage = self.textStorage;
....
- (void)createPages{
// Remove all current text containers
while (self.layoutManager.textContainers.count > 0){
[self.layoutManager removeTextContainerAtIndex:0];
}
NSMutableArray *textContainers = [NSMutableArray array];
NSUInteger lastRenderedGlyph = 0;
while (lastRenderedGlyph < self.layoutManager.numberOfGlyphs){
NSTextContainer *textContainer = [[NSTextContainer alloc] initWithSize:self.pageSize];
[self.layoutManager addTextContainer:textContainer];
[textContainers addObject:textContainer];
[self addDummyContainersForNewlinesAfterContainer:textContainer];
NSRange range = [self.layoutManager glyphRangeForTextContainer:textContainer];
lastRenderedGlyph = NSMaxRange(range);
}
self.textContainers = textContainers;
}
// In my ViewController
- (void)addTextViews{
self.scrollView = [[UIScrollView alloc] initWithFrame:self.view.bounds];
self.scrollView.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight;
self.scrollView.backgroundColor = [UIColor lightGrayColor];
[self.view addSubview:self.scrollView];
CGFloat xOffset = 0;
// Option #1 - This results in garbled text
for (NSTextContainer *textContainer in self.coordinator.textContainers){
break;
CGRect frame = CGRectMake(xOffset, 0, self.coordinator.pageSize.width, self.coordinator.pageSize.height);
xOffset = CGRectGetMaxX(frame)+1;
self.scrollView.contentSize = CGSizeMake(xOffset, self.coordinator.pageSize.width);
UITextView *textView = [[UITextView alloc] initWithFrame:frame textContainer:textContainer];
textView.attributedText = self.coordinator.textStorage;
[self.scrollView addSubview:textView];
}
// Option #2 - This does not result in garbled text
UITextView *textView = [[UITextView alloc] initWithFrame:self.view.bounds];
[self.view addSubview:textView];
textView.attributedText = self.coordinator.textStorage;
}
原来忘记加了
[self.textStorage addLayoutManager:self.layoutManager];
这解决了问题。