NSTextViewで文字色を設定する

以前、SwiftUIのTextで表示した文字列が選択しにくいので、TextNSTextViewで置き換えて、文字本体と認識する領域を拡張する方法を探りました。

a3colorr.hatenablog.com

しかしながら、下記の課題が残りました。

  • NSTextViewを文字列のサイズに合わせる
  • 文字として反応する当たり判定領域を広げつつ、ダブルクリックでエディタモードに戻れるようにする
  • NSTextViewを使っても文字色が変わらないようにする

この記事では、NSTextViewを使っても文字色が変わらないようにすることを書きます。
言い換えるなら、NSTextViewにも文字色を設定して文字色が変わらないようにする方法です。


もくじ


環境

NSText.textColorに色を設定する

developer.apple.com

下記のようにtextColorNSColorを設定します。

let tv = NSTextView()

tv.string = text
tv.textColor = NSColor(Color(.red))
tv.font = .systemFont(ofSize: 12)
// ただ、このブログを書く前は backgroundColor を使わないと
// 文字の色が変わらなかったのだが、なぜか今は textColor で色が変わる。。。
// tv.backgroundColor = NSColor(Color(.red)))


NSAttributedStringに色を設定する

developer.apple.com

下記のようにNSAttributedString.Keyと値をペアにしたDictionary型の属性を作り、文字列に属性を反映させたNSAttributedStringNSTextViewに設定します。

let tv = NSTextView()

let attributes : [NSAttributedString.Key : Any] = [
    .font: NSFont.systemFont(ofSize: fontSize),
    .foregroundColor: NSColor(Color(fontColor))
]

let att = NSAttributedString(string: text, attributes: attributes)
tv.textStorage?.setAttributedString(att)


どっちが良いのか?

時と場合によるのでしょう。
私が開発しているアプリの実装だと、後者のNSAttributedStringに色を設定する方法を使うと都合がよさそうです。