logo サブスレッド

SwiftUIでリンクテキストをダークモード対応

tamaです。
さんざん悩んでいたコトがあっさり解決できたのでとり急ぎメモとして。

SwiftUIで「途中にリンクを含んだ文字列を表示したい」というニーズがありまして、
UITextViewUIViewRepresentable に入れて表示してあげたんです。

しかしこれがダークモードにならない(背景が黒くなっても文字は白いまま)。

UITextView.textColor を明示したり、
こんな噂に惑わされて UIViewControllerRepresentable を使ったりといろいろ試したものの
どうしてもダークモードの文字が黒いまま。




原因は UITextView ではなく NSAttributedStringNSMutableAttributedString)にありました…
UITextView が表示するのは属性付き文字列(.attributedText)なので
色の指定は attribute として付けないといけない、と。
気付いてしまえばその通り…

let text = "このあたりがリンクになっています。"
let attributedText = NSMutableAttributedString(string: text, attributes: [.foregroundColor: UIColor.label])

みたいな!みたいな!
ちなみにリンク部分の文字色は UITextView.linkTextAttributes で指定します。

textView.attributedText = attributedText
textView.linkTextAttributes = [.foregroundColor: UIColor.secondaryLabel]

(実際は UIColor.labelUIColor.secondaryLabel ではなく userInterfaceStyle に応じて色が変わる UIColor値を指定しています)

半年後の自分がまた時間を無駄にしないように備忘として。
(書いたら忘れないとは言っていない)

現在の位置:サブスレッド ホーム > 技術ブログ > SwiftUIでリンクテキストをダークモード対応