iOSのUITextViewでattributedTextの扱い方について質問したいです。
私がしたいことはUItextViewのtextViewDidChangeが呼ばれたとき、現在textViewに記入されている文字を、テキスト量によってスタイルを変えたいということです。
もっと具体的にいうと、30文字を超えたら、超えている分の文字は赤色に変更したいです。
私がとった方法としては、通常の文字列と超過分の文字列を二つのattributedTextに分割してスタイリングをして、そのあとにそれらを繋げてtextView.attributedTextに代入するというものでした。
試したコードは以下の通りです。textViewのdidChange時に呼ばれるコードです。
swift
1let currentCount = textView.text.count 2if(currentCount > 30) { 3 let enabledStringAttributes: [NSAttributedString.Key : Any] = [ 4 .foregroundColor : UIColor.black, 5 .font : UIFont.systemFont(ofSize: 15.0) 6 ] 7 let enabledText = NSMutableAttributedString(string: String(textView.text.prefix(30)), attributes: enabledStringAttributes) 8 9 let disenabledStringAttributes: [NSAttributedString.Key : Any] = [ 10 .foregroundColor : UIColor.red, 11 .font : UIFont.systemFont(ofSize: 15.0) 12 ] 13 14 let from = textView.text.index(textView.text.startIndex, offsetBy: 30) 15 let disenabledText = NSMutableAttributedString(string: String(textView.text[from...]), attributes: disenabledStringAttributes) 16 17 let mutableAttributedString = NSMutableAttributedString() 18 mutableAttributedString.append(enabledText) 19 mutableAttributedString.append(disenabledText) 20 21 textView.attributedText = mutableAttributedString 22
しかしこれだと、なぜか30文字を超えた入力からおかしな挙動になります。以下のスクリーンショットは、30文字目入力時点、31文字目に「お」を入力した時点、32文字目に「い」を入力したものになります。
そもそもの方向性が違うのか、少し変えればできるのか、しばらく格闘してみましたがわかりませんでした。
どなたかご教示して頂けると幸いです。
よろしくお願いします。
追記1
英語だとうまくいっていることがわかりました。これは日本語の扱いによる問題なのでしょうか? だとするとどうすれば解決できるのか... ご教示して頂けると嬉しいです。
追記2
やはり日本語変換の問題だと判明しました。
swift
1if(textView.markedTextRange == nil) { 2 myTextViewDelegate?.textViewDidChange(textView: textView) 3}
で上のコードを呼び出すことで、「入力確定時」に期待した色になることを確認できました。しかし変換中は30文字を超えていてもずっと黒いままであり、変換終了後に一気に赤くなるような仕様になってしまいます。これを解決する方法はあるのでしょうか?
回答1件
あなたの回答
tips
プレビュー