iOS 7文本工具包:当NSLayoutManager填充其最后一个NSTextContainer时?

时间:2014-01-29 20:00:35

标签: ios ios7 uipageviewcontroller textkit

我正在使用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看看是否完成了文本的布局?

2 个答案:

答案 0 :(得分:1)

我从来没有能够正确调用回调方法 - 我认为这是一个错误 - 但我找到了一种检查下一个容器是否为空的方法..

    [_layoutManager addTextContainer:textContainer];
    NSRange range = [_layoutManager glyphRangeForTextContainer:textContainer];
    if (range.length == 0) {
        return nil;// top adding container because this last one is empty
    }

答案 1 :(得分:0)

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

layoutManager.addTextContainer(container)

let glyphRange = NSMaxRange((layoutManager.glyphRangeForTextContainer(container)))
if glyphRange >= layoutManager.numberOfGlyphs {
    // last container
}