我有一个NSTextStorage,里面有很长的文本(就像一本书中的500页,在一个设备上有超过9000页的当前字体)。我以这样的方式为文本容器分发文本:
let textStorageLength = defaultTextStorage?.length ?? 0
while layoutManager!.textContainer(forGlyphAt: textStorageLength - 1,
effectiveRange: nil) == nil {
let textContainer = NSTextContainer(size: textContainerSize)
layoutManager!.addTextContainer(textContainer)
pagesCount += 1
}问题是需要很长时间才能插入所有这些容器等等。我已经做了一些改进,比如修改代码
while lastRenderedGlyph < layoutManager!.numberOfGlyphs {
和
lastRenderedGlyph = NSMaxRange(layoutManager!.glyphRange(for: textContainer))
它的工作速度要慢得多。
那么,,我还能做什么改进呢?在iPhone 7上,输入大约需要7秒,在iPhone 5s 20秒+上
时间分析器显示,几乎所有的时间都是获取insertTextContainer函数(addTextContainer)。
有什么建议吗?
发布于 2018-04-02 08:34:26
布局管理器使addTextContainer方法调用上的布局无效,并在textContainer(forGlyphAt:effectiveRange:)上重新构建布局。您可以通过设置布局管理器的委托和观察layoutManagerDidInvalidateLayout来检查它。所以,不要只做一次布局,而是对每个添加的文本容器执行500次-一次。
您可以在批中添加文本容器以减少布局的数量。
var lastTextConainer: NSTextContainer? = nil
while nil == lastTextConainer {
for _ in 1...100 {
let textContainer = NSTextContainer(size: textContainerSize)
layoutManager.addTextContainer(textContainer)
}
lastTextConainer = layoutManager.textContainer(forGlyphAt: layoutManager.numberOfGlyphs - 1, effectiveRange: nil)
}
let pagesCount = layoutManager.textContainers.index(of: lastTextConainer!)! + 1在末尾的空文本容器,您可以离开或删除从最后一个文本容器索引开始。享受吧!
https://stackoverflow.com/questions/49496569
复制相似问题