将NSTextContainer / NSLayoutManager与UITextView一起使用时,文本会出现乱码

时间:2016-02-02 15:14:33

标签: ios uitextview nslayoutmanager nstextcontainer

我实现了分页文本,所以我使用NSLayoutManager和NSTextContainer为每个页面创建UITextViews。分页工作正常,但文本是乱码。在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;
}

Good Text Bad Text

1 个答案:

答案 0 :(得分:0)

事实证明我忘了添加

    [self.textStorage addLayoutManager:self.layoutManager];

这解决了这个问题。