NSLayoutManager:调用setLocation(_:forStartOfGlyphRange :)将禁用整个string中的字距?

我创build了简单的NSLayoutManager子类,允许为定义的子string设置自定义的布局位置:

 class PositionableLayoutManager: NSLayoutManager { var xOffsetsPerGlyphRange = [(NSRange, CGPoint)]() override func invalidateLayoutForCharacterRange(charRange: NSRange, actualCharacterRange actualCharRange: NSRangePointer) { super.invalidateLayoutForCharacterRange(charRange, actualCharacterRange: actualCharRange) for (range, offset) in xOffsetsPerGlyphRange { setLocation(offset, forStartOfGlyphRange: range) } } } 

现在,我可以像这样定义任何字符范围的自定义位置:

 let glyphRange = layoutManager.glyphRangeForCharacterRange(charRange, actualCharacterRange: nil) layoutManager.xOffsetsPerGlyphRange.append((glyphRange, customPointLocation)) layoutManager.invalidateLayoutForCharacterRange(NSRange(location: 0, length: textStorage.length), actualCharacterRange: nil) 

它工作正常,唯一的问题是,这种方式重新定位的任何字形范围都布置和绘制没有字间距。 这里是一个例子:

在这里输入图像说明

在绿框中使用我的PositionableLayoutManager绘制的文本没有字距,在粉红色的框中有与使用UILabel绘制的kering相同的文本进行比较。

我怎么能做同样的事情,但适当的字距?