[Swift][TextKit2] NSTextLayoutFragment に該当する String を取得する

     
⌛️ < 1 min.

忘れてしまった時に コピペで使用できるスニペットシリーズ TextKit2 編

環境&対象

以下の環境で動作確認を行なっています。

  • macOS14.4
  • Xcode 15.2
  • iOS 17.2
  • Swift 5.9

willSet/didSet

TextKit2 では、Layout の矩形は、NSTextLayoutFragment で表現されます。

デバッグ等のために、NSTextLayoutFragment が描画するはずの String/NSAttributedString としては、どうなっているか確認したくなることがあります。

ですが、TextKit2 では、クラス間のやり取りが多く、どのクラスがどのように紐づいているを見失いがちで、対応を見つけるのが手間なので、code snippet として残しておきます。

TextLayoutFragment は、対応する情報としては NSTextElement を持っています。
この NSTextElement は、NSTextContentStorage に問い合わせることで該当 NSAttributedString を取得することができます。

以下では、NSTextLayoutFragment の描画予定の String を Log しています。

let layoutFragment: NSTextLayoutFragment = ....
OSLog.log.debug("NSTextLayoutFragment has \(self.layoutFragment.attrString?.string ?? "")")

以下のように、extension にして使用しました。

extension NSTextLayoutFragment {
    var attrString: NSAttributedString? {
        guard let textElement = textElement,
              let textContentStorage = textElement.textContentManager as? NSTextContentStorage,
              let attrString = textContentStorage.attributedString(for: textElement) else { return nil }
        return attrString
    }
}

注意:NSTextContentManager を継承している NSTextContentStorage を使っている前提です。

独自実装のクラスで NSTextContentManager を継承しているのであれば、(大抵は)その独自クラスの中で対応づけを保持していると思いますので、そこから対応情報を取得することになります。

まとめ

NSTextLayoutFragment から、該当 String を取得する方法を説明しました。

NSTextLayoutFragment から、該当 String を取得する
  • NSTextLayoutFragment は、対応する NSTextElement を持っている
  • NSTextElement 経由で NSTextContentStorage/NSTextContentManager を取得する
  • NSTextContentStorage から、NSTextElement に相当する String/NSAttributedString を取得する

説明は以上です。
不明な点やおかしな点ありましたら、こちらまで。

Swift学習におすすめの本

詳解Swift

Swift の学習には、詳解 Swift という書籍が、おすすめです。

著者は、Swift の初期から書籍を出していますし、Swift の前に主力言語だった Objective-C という言語についても同様の書籍を出しています。

最新版を購入するのがおすすめです。

現時点では、上記の Swift 5 に対応した第5版が最新版です。

SwiftUI おすすめ本

SwiftUI を理解するには、以下の本がおすすめです。

SwiftUI ViewMatery

SwiftUI で開発していくときに、ViewやLayoutのための適切なmodifierを探すのが大変です。
英語での説明になってしまいますが、以下の”SwiftUI Views Mastery Bundle”という本がビジュアル的に確認して探せるので、便利です。

英語ではありますが、1ページに コードと画面が並んでいるので、非常にわかりやすいです。

View に適用できる modifier もわかりやすく説明されているので、ビューの理解だけではなく、どのような装飾ができるかも簡単にわかります。

超便利です

SwiftUIViewsMastery

販売元のページは、こちらです。

SwiftUI 徹底入門

# SwiftUI は、毎年大きく改善されていますので、少し古くなってしまいましたが、いまでも 定番本です。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です