はじめに
iOSDC Japan 2018で「UIViewとUITextInputで作る縦書きのTextView」というタイトルで発表しました。発表資料はこちら。動画は入ってません。
さて。この記事では、以下の3つを書きます。
- 発表の概要
- 発表の補足
- iOSDCの感想
発表の概要
- TextViewとは何か
- IME/キーボードからのテキストを受け取ることができるView
- 人間向けのフィードバックとしてテキストが表示されるView
- IME APIとは何か
- IMEとViewの間に立ってテキスト入力を可能にするOS (GUI) の仕組み
- IMEとViewがお互いの実装を知らずに動作可能になる
- UITextViewは実装できるか
- どれも実装可能
- 実装されるレイヤが多岐にわたるので注意
- iOSでの縦書きTextViewの注意点
- できることは少ない
- スマホでの縦書きはソフトキーボードとの領域の奪い合い
発表の補足
発表後にこういう反応がありました。
自分が実装したときは拡大レンズになるときがいまいち分からず放置していたんだけれど、自前で実装でいいのだろうか。なんかかな漢字変換中に触ったりすると拡大レンズ表示されたりするからちゃんとプロトコル実装すればOSが出してくれるものかと思っていたけれど。 https://t.co/ED3royD72K
— ゆいしろ (@lifeaether) 2018年9月3日
そうなんです。
未確定文字列のときとそれ以外の時で、選択範囲を決めるという行為の持つ意味が大きく違うのです。
(このツイートを見るまで完全に忘れていた。情報を発信すると情報が集まってくるってこういうことなんですね)
具体的にどういうことかというと、
- 未確定文字列のないとき
- キーボードがタッチイベントを奪うことはない
- タッチイベントに基づく選択範囲の変更はすべてTextView側が行う
- 選択範囲を変える=特に何もおきない(キーボードの予測変換が変わるくらい)
- キーボードがタッチイベントを奪うことはない
- 未確定文字列があるとき
- キーボードが未確定文字列の範囲のタッチベントを奪う
- タッチイベントに基づく未確定文字列内の選択範囲の変更はキーボード側が行う
- 選択範囲を変える=未確定文字列が確定される
- キーボードが未確定文字列の範囲のタッチベントを奪う
なので拡大鏡はキーボードが出すこともあるので、未確定文字列への縦書き対応は全然できないねということです。
悲しいですね。
iOSDCに参加して
iOSDC楽しかったです。
iOSの知らなかった話や、よく覚えのある話といったのをたくさん聞けたのはもちろんiOSアプリ開発をしてる人はこんなにいるんだなーというのを実感とともに知ることができました。
他にも
- ランチが美味しい(特にニューヨークチキンライスが良かった)
- ネットワークが快適(グローバル IPが降ってくるやつは使わなかった)
- 会場・企画説明などの各種動画(ナレーションが声優さんなので聞いててなんか楽しい)
といった感じでした。
今回、縦書きエディタの話をしましたが、実はTATEditorに関連した話を外で発表するのは初めてでした。発表するまで、果たして縦書きエディタの話に興味ある人は世界のどこにいるんだろうと思ってましたが、興味のある人に聞いてもらえたようで良かったです。
発表後、縦書きやってるよという話もいくつか聞けました。残念ながら、縦書きエディタやってるよという話まではついぞ聞けませんでしたが。
来年もiOSDCで発表できたらいいなあ(何か話せることあるかな)。
おわりに
発表資料を作る過程でIME APIを中心にした、ViewとTextViewの関係についてまとまって自分の中でも色々と整理ができて良かったです。
なんかクロスプラットフォームなIME APIライブラリも意外と書けるのかも?という気が少ししました。
そういえばAndroidでも縦書きエディタ作ってるので、DroidKaigiにも応募しようかなと思ってます。
余談。
iOSDCのAsk the Speakerで、macOSの縦書きTextViewはどうやって縦書きであることを伝えるのかという話をしたらこういうツイートになって返ってきました。
#iosdc で @496_さんに縦書きエディタの話を聞いたので、縦書きモードでも変換候補ウインドウがテキストにかぶらないように修正できた。(iOSとは) pic.twitter.com/ayPLn0LBDJ
— mzp (@mzp) 2018年9月1日