我创建了简单的NSLayoutManager
子类,允许为已定义的子字符串设置自定义布局位置:
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相同的文字进行比较。
如何通过适当的字距调整来做同样的事情?