首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >NSLayoutManager numberOfGlyphs总是显示0,迅速

NSLayoutManager numberOfGlyphs总是显示0,迅速
EN

Stack Overflow用户
提问于 2020-10-05 19:39:06
回答 1查看 151关注 0票数 0

我试图创建一个多页PDF与UITextView在每一页与所需的属性文本。但是,当我遇到一个问题,一旦应用程序存档和分发通过TestFlight进行测试。

下面是我用来生成多页的示例代码,

代码语言:javascript
复制
var textStorage = NSTextStorage()
textStorage = NSTextStorage(attributedString: attString)

let layoutManager = NSLayoutManager()

textStorage.addLayoutManager(layoutManager)

var pageSize = CGRect(x: 44, y: 108, width: 507, height: 690)
var lastGlyph = 0

while lastGlyph < layoutManager.numberOfGlyphs {
     let textContainer = NSTextContainer()
     let background = UINib(nibName: "background", bundle: nil).instantiate(withOwner: nil, options: nil)[0]
     background.frame = pageRect
     textContainer.size = subsequentPageSize.size
     layoutManager.addTextContainer(textContainer)
     let textView = UITextView(frame: pageSize, textContainer: textContainer)
     pageSize.origin.x += pageSize.width
     background.addSubview(textView)
     context.beginPage()
     background.layer.render(in: UIGraphicsGetCurrentContext()!)

     lastGlyph = NSMaxRange(layoutManager.glyphRange(for: textContainer))
}

如果从Xcode构建时在模拟器或设备上运行,这是非常好的,但是一旦应用发布,layoutManager.numberOfGlyphs总是返回0,即使我打印()它显示的布局管理器,

代码语言:javascript
复制
    <NSLayoutManager: 0x7ff313c9f6d0>
    0 containers, text backing has 57 characters
    Currently holding 57 glyphs.
    Glyph tree contents:  57 characters, 57 glyphs, 1 nodes, 64 node bytes, 64 storage bytes, 128 total bytes, 2.25 bytes per character, 2.25 bytes per glyph
    Layout tree contents:  57 characters, 57 glyphs, 0 laid glyphs, 0 laid line fragments, 1 nodes, 64 node bytes, 0 storage bytes, 64 total bytes, 1.12 bytes per character, 1.12 bytes per glyph, 0.00 laid glyphs per laid line fragment, 0.00 bytes per laid line fragment'.

我是不是漏掉了一些愚蠢的东西,或者是不是有一个我不知道的bug?我无法为我的一生明白它为什么不起作用!

感谢你所能给予的帮助。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-10-08 08:32:33

我最终在NSTextStorage子类注释中找到了一个解决方案,

--NSTextStorage类--实现了更改管理(通过NSTextStorage()和endEditing()方法)、属性验证、委托处理和布局管理通知。它没有实现的一个方面是管理实际的属性字符串存储,子类通过覆盖两个NSAttributedString原语来管理.

因此,我修改了我的代码,并将textStorage.beginEditing()和textStorage.endEditing()添加到整个序列的开头和结尾,如下所示,一旦项目实现并直接从Xcode构建到设备或模拟器,它就可以工作了。

代码语言:javascript
复制
var textStorage = NSTextStorage()
textStorage.beginEditing()
if attribString != nil {
    textStorage = NSTextStorage(attributedString: attribString)
} else {
    textStorage = NSTextStorage(string: string)
}

let layoutManager = NSLayoutManager()
textStorage.addLayoutManager(layoutManager)

var pageSize = CGRect(x: 44, y: 108, width: 507, height: 690)
var lastGlyph = 0
while lastGlyph < layoutManager.numberOfGlyphs {     
    let textContainer = NSTextContainer()     
    let background = UINib(nibName: "background", bundle: nil).instantiate(withOwner: nil, options: nil)[0]     
    background.frame = pageRect     
    textContainer.size = subsequentPageSize.size     
    layoutManager.addTextContainer(textContainer)     
    let textView = UITextView(frame: pageSize, textContainer: textContainer)     
    background.addSubview(textView)     
    context.beginPage()     
    background.layer.render(in: UIGraphicsGetCurrentContext()!)    
    lastGlyph = NSMaxRange(layoutManager.glyphRange(for: textContainer))
}
textStorage.endEditing()
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64215124

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档