阿拉伯文本太长的 CoreText

CoreText With Too Long Arabic Text

我试图按照有关 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)
}

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

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

文字较小时的效果图:

这是当文本数量超过 10kb 时呈现的文本, 它看起来脱节和颠倒:

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

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

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

let typesetterOptions = [kCTTypesetterOptionAllowUnboundedLayout: true] as CFDictionary
let typesetter = CTTypesetterCreateWithAttributedStringAndOptions(attrString,
                                                                  typesetterOptions)!
let framesetter = CTFramesetterCreateWithTypesetter(typesetter)