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 更改 SKAction 中的 zPosition