我创建了简单的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)
它工作正常,唯一的问题是任何以这种方式重新定位的字形范围都是在没有字距调整的情况下布局和绘制的。这是一个例子:
在绿色框中有使用 my PositionableLayoutManager
with 没有字距绘制的文本,在粉红色框中有相同的文本,使用 kering 绘制UILabel
用于比较。
我怎样才能做同样的事情,但有适当的字距调整?