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相同的文本进行比较。
我怎么能做同样的事情,但适当的字距?