SwiftUI: TabView(page Stlye)でキーボードを表示させている時の.disable(横スワイプによる移動を禁止させる)にはバグがあるようだ
SwiftDataに切り替えて、データ扱い周りがとっても簡単になったので、インタラクション周りの実装に時間を注ぐ。そしてバージョンアップリリースまで頑張る。
まずは、Noteの入力UIの改善
問題は二つ
- キーボードが表示された状態で、InputViewがスライドできてしまう。
- 別のViewに移ったら、キーボードを自動で畳むなどしたい。
- もしくは、キーボードが表示されてる最中は、スライドできないようにする。
ベストなのは後者。
- キーボードの確定を押しても、キーボードが出ている状態で、View上のDoneを押しただけでは反映されない。
- 現状の実装として、画面上をタップして、キーボードからフォーカスが外れたタイミングで、dailylog.noteのプロパティに、入力内容を代入するようにしている。
- 上記だけでは足りなくて、キーボードの確定で、代入できるようにしなければいけない。
ただ、キーボードの確定が上手くキャッチできない。onSubmitが動かんのよ。。
InputScreensで、タブ切り替えするタイミングで、適切なタイミングでキーボードを出したり閉じたりさせる。
ここから左にスライドさせると。。
まだキーボードが出ちゃってる。ダメだこりゃ。
FocusStateのバインディングが必要。
親のTabViewにて、Noteが表示されてる時にのみ立てるフラグをNoteViewにBindingさせて、TabViewが切り替わったタイミングで表示させたけど、理想通りではない。
切り替えた時のキーボードの畳まれ方が気に食わぬ。。
Preferenceを使うべきなのかな。
上の件も対処しなきゃだけど、キーボードエンター押した時の処理を実装しなきゃ。と思ったけど、Xcode15 beta版はiPhone14 Proだけに起こる?バグがあるっぽい?
いや、これ仕様なのか。
複数行のTextFieldにしたときに onSubmitが動かないのか。
やっぱりonChangeで入力されてる値を都度代入し続けなくちゃいけないんだな。
この対応すると、何回もTab CalendarViewが読み込まれるようになってしまった。。なぜ。
もしくは、キーボードが表示されてる最中は、スライドできないようにする。
これをやるか。。
しょうがないのでUIフロー自体を変えることにした。
そもそもFirestoreをもう使ってないので、InputView自体は、
アクションした段階で、保存処理をすればいいのであるけど、
テキスト系だけはDoneを検知しなくちゃいけないので。。。
上の案は本末転倒な感じがしたのでFigmaファイルをいじろうとしたところでやめました。
9:00までやる。
と言うのも、まさに試したい解決方法を発見したので。
あれ!!上のやつ、よく見たら、横スライドなんだけど、TabViewじゃない。ScrollView(.horizontal)
で実装されてる。。
だけど、 isShowingKeyboard
のプロパティ生やすところとか一緒だな。
なるほど。NotificationCenter 使うのか。(AppleDocument検索したときに、なんでこのAPIに気づかなかったのだろう。。
と思ったら、UIKitのAPIだったか。。
なぜなのか。 TabViewだから?
2回してる。
keyboardWillShowNotification
あとで読む
要素だけ取り出した、
サンプルプログラムで実行 Xcode 14.3.1でiPhone16.4でやっても同じ。
結局同じことが起こった。バグかな。。
むーーーーーん。これ?
上の形で、キーボードの表示を検知しても、同じことが起こった。
多分、TabView.disabled()が動いてないな。。
もうキーボードを表示させてる時にTabViewで他のTabに移動できなくさせる処理は諦めた。
なので、Note以外のViewに遷移した時に、Focusを外す。という当初の処理に戻す。
が、消える時のアニメーション処理がダサすぎて。な
これで対処するかな。。
むむむ。も、もしや。
VStackの影響?Autoだから?
このエクステンションかますことでようやく対処できるかも。。
ダメだった。。なんなの。。
もう物理的にジェスチャーを防ぐしかないか。とこれをトライするもやっぱりだめ。。
これ変更を加えたのに、クローズしようとした時の挙動に使える。
が、本命がわからんー。
もうダメだ。。
NotificationCenterのタイミングじゃないかと思うのでこの辺りもうちょい頑張ってみる。
全然関係ないけど、これ。
これ、これ、ちゃんと読み込む
なるほど。そもそもTabViewはignoresSafeAreaが機能しないっぽい。
これ試したけど、事象が違った。
もうダメだな。私の知識では解決無理だ。諦めよう。
TabViewの時だけ、キーボードを表示させた時に、TabView.disabledが効かない。と言うことで。
(ミニマムな基本構造だけのプロトタイプで実証した時にも同じことが起こってるからこれはもう既存のバグだわ。。)
しばらく、夜のコーディング作業はお肌と体調によくないと思って(やさぐれて)放置しておりましたが、上記の問題を解決するのは諦めて、UIフローそのものを変更することで行こうと思います。
それにしても、今回の件は、デザインと実装を私が一人だけでやってるから、こう言う判断がすばやくできるものの(とはいえ諦めきれずに少々粘ってしまったが。)、
デザイナーとエンジニアで別れていたりするとこの辺りのコミュニケーションってどうやって円滑に取りつつ、スピード優先で動けるんだろうな。。と思う事案です。
でも、今回は私も、できれば解決したかった。想定したUIフローを実現したかった。。
割と、実装詰まると「UIの方を調整すっかー」ってすぐに気持ち切り替えるタイプだけど、
今回だけはUIを諦めると、明らかに冗長な感じのUIフローになるので本当に嫌だったのよぉ。
ので絶賛気持ちが萎えてますw
書いてなかったんだけど、UIフローを変えてこのタスク自体は完了してます。
一回、普通にこんなふうにしてたんだけど、
その後、デイリーのDoneは無くしてます。
SwiftDataへの保存トリガーは各項目を更新したら即反映みたいなUIになりました。
というわけで、このスクラップは以上でクローズです。