以前、SwiftUIのTextで表示した文字列が選択しにくいので、TextをNSTextViewで置き換えて、文字本体と認識する領域を拡張する方法を探りました。
しかしながら、下記の課題が残りました。
- NSTextViewを文字列のサイズに合わせる
- 文字として反応する当たり判定領域を広げつつ、ダブルクリックでエディタモードに戻れるようにする
- NSTextViewを使っても文字色が変わらないようにする
この記事では、NSTextViewを使っても文字色が変わらないようにすることを書きます。
言い換えるなら、NSTextViewにも文字色を設定して文字色が変わらないようにする方法です。
もくじ
環境
- Xcode 26.1.1
- Swift 6
NSText.textColorに色を設定する
下記のようにtextColorにNSColorを設定します。
let tv = NSTextView() tv.string = text tv.textColor = NSColor(Color(.red)) tv.font = .systemFont(ofSize: 12) // ただ、このブログを書く前は backgroundColor を使わないと // 文字の色が変わらなかったのだが、なぜか今は textColor で色が変わる。。。 // tv.backgroundColor = NSColor(Color(.red)))
NSAttributedStringに色を設定する
下記のようにNSAttributedString.Keyと値をペアにしたDictionary型の属性を作り、文字列に属性を反映させたNSAttributedStringをNSTextViewに設定します。
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に色を設定する方法を使うと都合がよさそうです。