4
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 1 year has passed since last update.

UITextDocumentProxyのsetMarkedTextを(まだ)使ってはいけない

Last updated at Posted at 2020-06-26

更新

iOSカスタムキーボードのsetMarkedTextの現状」でiOS14.4現在の状況について書いています。

[2022-11-11追記]
導入しました。

概要

iOSのKeyboard Extensionを自作するとき、必ず触ることになるのがUITextDocumentProxyです。

iOS13からはsetMarkedText(_:selectedRange)というメソッドが追加され、これを使うことで標準の日本語キーボードのような「入力中のテキストの背景の色が変わる」挙動が実現できるように思われます。

実際、4月に複数のキーボードで調べたところでは2つのKeyboard Extension(flickFlick SKK)がsetMarkedText()を用いていると思われる挙動を示していました。

2020年8月17日追記

flickはデフォルトでこの機能を無効にしたと思われます。以前の挙動は設定から「インライン入力を可能な限り使う」をオンにすることで再現します。

挙動の詳細

チェックした環境はiOS 13.5.1のiPhoneSE(第1世代・第2世代)です。

ezgif-6-0ef87aa0999a.gif

少し何が起きているかわかりにくいですが、消える瞬間にテキストをタップしています。標準キーボードを利用してきたユーザが期待する動作はカーソルの移動ですが、(何故か)入力中のテキストが全く見えなくなる挙動を示します。
これはFlick SKKについても同一です。そもそもsetMarkedText(_:selectedRange)がこの挙動を示すので、当然といえば当然です。
#まだ使うべきではない
入力中のテキストの背景の色が変わるのは標準キーボードで当然の動作ですし、できれば実装したほうがユーザフレンドリーな動作です。が、それによってできることが著しく制限されます。実際に制限されるのは

  • 入力中の(キーボードを介さない)カーソル移動
    • 入力中の(キーボードを介さない)変換範囲の指定
    • 入力中の(キーボードを介さない)誤字の修正
  • 入力中の範囲外タップによる入力終了
    • flickでは範囲外タップで入力中の文章が消滅する(仕様?)

などなどです。当然バグの温床でもあります。
さらに、この挙動を修正する方法は今のところありません。散々格闘しましたが、標準のキーボードはおそらくsetMarkedTextを使っていないんじゃないかと思います。もし詳しいことをご存知の方いらっしゃいましたら教えてください。
ただ、いろいろなKeyboard Extensionのレビューを見て見ると「入力中の文字の色が変わるようにしてくれ」という要望はかなり多いです。iOS12までは「appleに言ってくれ」が答えでしたが、iOS13では「appleに文句言ってくれ」と答えたいところでしょう。なんでappleはわざわざこんな使えないものを追加したんだ……。

参考

4
3
2

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
4
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?