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
同じことを適切なカーニングで行うにはどうすればよいですか?