1

我将 Text Kit 与 UIPageViewController 结合使用来创建一本书。原始文本存储在文本文件 (.html) 中并放入 NSTextStorage。

[NSLayoutManager addTextContainer:(NSTextContaner*)txt] 方法效果很好,但是无法知道 NSLayoutManager 何时填充了最后一个 NSTextContainer - 即使在显示所有下一个之后,它仍然会继续返回 NSTextContainer。结果,在 NSLayoutManager 完成后,您将获得所有银行页面。

我试过使用 [NSLayoutManagerDelegate didCompleteLayoutForTextContainer: atEnd:] 回调方法,但它不能正常工作。它在填充每个 NSTextContainer 后返回 atEnd flag = YES,而不仅仅是在填充最后一个 NSTextContainer 时。我已经设置了 UITextView.scrollable = NO (在其他地方建议)但这没有帮助。

当没有显示文本时,我还尝试通过调用 UITextView.text 来检查文本,但该方法总是返回位于 NSTextContainer/NSLayoutManager 后面的整个 NSTextStorage 的内容。

如果我不知道最后一个容器何时装满,我不知道所有页面何时布置好。有没有办法测试 UITextView 以查看其是否为空或 NSContainer,或 NSLayoutManager 以查看是否完成了文本布局?

4

2 回答 2

1

我永远无法正确调用回调方法-我认为这是一个错误-但我找到了一种方法来检查下一个容器是否为空..

    [_layoutManager addTextContainer:textContainer];
    NSRange range = [_layoutManager glyphRangeForTextContainer:textContainer];
    if (range.length == 0) {
        return nil;// top adding container because this last one is empty
    }
于 2014-02-05T03:03:53.707 回答
0

通过调用 glyphRangeForTextContainer 方法检查容器是否是最后一个。如果它超过字形的数量,那就是最后一个容器。

layoutManager.addTextContainer(container)

let glyphRange = NSMaxRange((layoutManager.glyphRangeForTextContainer(container)))
if glyphRange >= layoutManager.numberOfGlyphs {
    // last container
}
于 2015-12-05T16:23:39.617 回答