2
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

textのAttributedStringをClearする

Posted at

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を利用することで、
文字背景色を透明に戻します。

これで目的達成!!

と思いきや!文字を追加してみたら

...目的達成ならず :cry:

他の設定が必要。 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

参考

2
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?