带有太长阿拉伯文本的 CoreText

Bat*_*azy 5 core-text ios swift arabic-support

我试图按照关于 CoreText 的教程以及如何绘制文本,并在我的 customView 中实现了这个功能。

override func draw(_ rect: CGRect) {         
 guard let context = UIGraphicsGetCurrentContext() else { return }       
 let path = CGMutablePath()
 path.addRect(bounds)
 let attrString = NSAttributedString(string: "Hello World")
 let framesetter = CTFramesetterCreateWithAttributedString(attrString as CFAttributedString)
 let frame = CTFramesetterCreateFrame(framesetter, CFRangeMake(0, attrString.length), path, nil) 
 CTFrameDraw(frame, context)
}
Run Code Online (Sandbox Code Playgroud)

当文本很短时它工作正常,但当文本超过 10k 个字母时,它会以错误的方式呈现。有什么解决办法吗?

注意:当文本为阿拉伯语而不是英语时会发生这种情况。

这是文本很小时的渲染: 在此处输入图片说明

这是当文本数量超过 10kb 时的文本渲染,它显得脱节和颠倒

在此处输入图片说明

Rob*_*ier 3

根据您来自 Apple 的反馈,当字符串长度超过特定大小时,CTFramesetter 似乎会关闭高级布局。(他们的建议是因为存在混合方向的文本,这听起来不对;我肯定只用阿拉伯语复制了这个。)

要解决此问题,您需要使用始终执行高级布局的自定义排字机创建一个框架设置程序(kCTTypesetterOptionAllowUnboundedLayout)。幸运的是,这很简单。

首先创建一个自定义排字机,然后使用它来创建框架:

let typesetterOptions = [kCTTypesetterOptionAllowUnboundedLayout: true] as CFDictionary
let typesetter = CTTypesetterCreateWithAttributedStringAndOptions(attrString,
                                                                  typesetterOptions)!
let framesetter = CTFramesetterCreateWithTypesetter(typesetter)
Run Code Online (Sandbox Code Playgroud)