1

我创建了简单的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 PositionableLayoutManagerwith 没有字距绘制的文本,在粉红色框中有相同的文本,使用 kering 绘制UILabel用于比较。

我怎样才能做同样的事情,但有适当的字距调整?

4

0 回答 0