iOS 7 Text Kit:NSLayoutManager 何时填充了它的最后一个 NSTextContainer?

Posted

技术标签:

【中文标题】iOS 7 Text Kit:NSLayoutManager 何时填充了它的最后一个 NSTextContainer?【英文标题】:iOS 7 Text Kit: When has NSLayoutManager filled its last NSTextContainer? 【发布时间】:2014-01-29 20:00:35 【问题描述】:

我将 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 看是否完成了文本布局?

【问题讨论】:

【参考方案1】:

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

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

【讨论】:

【参考方案2】:

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

layoutManager.addTextContainer(container)

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

【讨论】:

以上是关于iOS 7 Text Kit:NSLayoutManager 何时填充了它的最后一个 NSTextContainer?的主要内容,如果未能解决你的问题,请参考以下文章

iOS 7 Sprite Kit 动画速度变化

iOS 7 Sprite Kit 释放内存

iOS 7 之前的 Sprite Kit 可用性

iOS 7 Sprite Kit 更改 SKAction 中的 zPosition

在 removeFromParent 上 Sprite Kit iOS 7.1 崩溃

关于Text Kit 一些事