NSLayoutManager numberOfGlyphs始终显示0,Swift

问题描述

我正尝试在每页上使用UITextView创建具有所需属性文本的多页PDF。但是当我遇到问题时,将应用程序存档并通过TestFlight分发进行测试。

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

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,即使我使用print()显示的layoutmanager,

    <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,0 laid glyphs,0 laid line fragments,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'.

我是否错过了一些愚蠢的事情,或者是否存在我不知道的错误?我一生无法理解为什么它不起作用!

感谢可能提供的帮助。

解决方法

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

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

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

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()

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...