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

时间:2015-07-17 16:55:25

标签: ios swift text core-text nslayoutmanager

我创建了简单的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)

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

enter image description here

在绿色方框中,使用我的PositionableLayoutManager绘制文字而不进行字距调整,在粉红色方框中,使用UILabel绘制了与kering相同的文字进行比较。

如何通过适当的字距调整来做同样的事情?

0 个答案:

没有答案