コードサンプル
NSLayoutManager, NSTextContainer & NSTextStorage
次のように初期化されたカスタムNSView
(TextView ではない)にas プロパティがありawakeFromNib()
ます。
textStorage = NSTextStorage(attributedString: self.attributedString)
layoutManager = NSLayoutManager()
textContainer = NSTextContainer(containerSize: NSMakeSize(self.frame.size.width, 1))
layoutManager.addTextContainer(textContainer)
textStorage.addLayoutManager(layoutManager)
layoutManager.glyphRangeForTextContainer(textContainer)
containerSize
レンダリングされるテキストを非表示にする効果があるかどうかを確認するために、の垂直方向NSTextContainer
は意図的に 1 に設定されていますが、そうではありません! ビューでのこのテキストのレンダリングに違いはありません-これが質問の主題です!
drawRect
テキストを描画するために以下の行を含めます。
let glyphRange = layoutManager.glyphRangeForTextContainer(textContainer)
self.lockFocus()
layoutManager.drawGlyphsForGlyphRange(glyphRange, atPoint: NSMakePoint(0, 0))
self.unlockFocus()
所見
- 反転した座標系でカスタム ビューを操作するのが最善のようです。他の方法
NSTextView
では、苦痛の世界に陥りそうな気がします。これに関係なく、NSLayoutManager は常に反転した座標系で内部的にテキストの描画を開始します (のようにNSTextView
) 。 - の
containerSize.width
プロパティにNSTextContainer
は次の効果があります。最初のレベルを含むすべてのレベルの行レベルでバインドされます (明らかだとわかっていますが、私に固執してください...) - の
containerSize.height
プロパティにNSTextContainer
はカーブボールがあります。含まれているビューに垂直に表示する余地がない場合でも、最初の行ではバインドされませんが、後続の行ではバインドされます
containerSize.height
*線を一本しか引いていなかったので、この仮説にたどり着くまでに長い時間がかかりました! *
質問
- に関する私の結論は
NSTextContainer
正しいですか? - 垂直方向の視点からテキスト描画を制御する最良の方法は何ですか? テキストの 1 行をビューの下部に配置したいと考えています (デフォルトのように上部に浮かせません)。