AttributedStringは、文字に背景色を付けたりする際に用います。
AttributedStringはlabelに付けれるだけでなく、
TextViewやTextFieldなどの入力でも利用できます。
この 「AttributedStringをClearしたい」 とき、
例えば 「TextView Edit中は背景色を透明に戻したい」 とき、
処理を実現するのに少し苦労したので、備忘録として記載します。
TextViewの文字背景色を黄色に
まず、TextViewの文字背景色を黄色にするコード。
@IBOutlet weak var textView: TextView!
func fillIn(value: String) {
let attributes: [NSAttributedString.Key: Any] = [
.backgroundColor: UIColor.yellow,
.font: UIFont.systemFont(ofSize: 20.0)
]
textView.attributedText = NSAttributedString(string: value,
attributes: attributes)
}
これでtextViewに値をFillInした際に、文字背景色が黄色になります。
TextViewの文字背景色を透明に戻す
AttributedStringをClearする、みたいな方法は見つけられませんでした。
そこで .backgroundColor: UIColor.clear
を設定した別のAttributedString
を用いることで、Clearを実現します。
「textViewの編集を開始したタイミング」でClearをします。
textViewのDelegateを設定しつつ、
textView.delegate = self
テキスト入力を始めた時 textViewDidBeginEditing
に処理を書きます。
extension ViewController: UITextViewDelegate {
func textViewDidBeginEditing(_ textView: UITextView) {
let attributes: [NSAttributedString.Key: Any] = [
.foregroundColor: UIColor.black,
.backgroundColor: UIColor.clear,
.font : UIFont.systemFont(ofSize: 20.0)
]
textView.attributedText = NSAttributedString(string: textView.text ?? "",
attributes: attributes)
}
}
背景色を透明に設定したAttributedStringを利用することで、
文字背景色を透明に戻します。
これで目的達成!!
と思いきや!文字を追加してみたら
...目的達成ならず
他の設定が必要。 typingattributes
なるものが。
https://developer.apple.com/documentation/uikit/uitextview/1618629-typingattributes
既に入力されたテキストだけでなく、
これから入力するテキストについても設定を追加する必要でした。
extension ViewController: UITextViewDelegate {
func textViewDidBeginEditing(_ textView: UITextView) {
let attributes: [NSAttributedString.Key: Any] = [
.foregroundColor: UIColor.black,
.backgroundColor: UIColor.clear,
.font : UIFont.systemFont(ofSize: 20.0)
]
textView.attributedText = NSAttributedString(string: textView.text ?? "",
attributes: attributes)
textView.typingAttributes = attributes // New!!
}
}
これで無事、目的達成。
まとめ
他に方法を知っている方がいればご教示頂けると幸いですm(__)m