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)

問題なく動作しますが、唯一の問題は、この方法で再配置されたグリフ範囲がカーニングなしでレイアウトおよび描画されることです。次に例を示します。

ここに画像の説明を入力

緑色のボックスには、カーニングなしで描画されたテキストがあり、ピンクのボックスには、比較のためPositionableLayoutManagerにケリングを使用して描画された同じテキストがあります。UILabel

同じことを適切なカーニングで行うにはどうすればよいですか?

4

0 に答える 0