NSLayoutManager numberOfGlyphs始终显示0,Swift

如何解决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()

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?