Closed33

SwiftUI: TabView(page Stlye)でキーボードを表示させている時の.disable(横スワイプによる移動を禁止させる)にはバグがあるようだ

satomilkysatomilky

SwiftDataに切り替えて、データ扱い周りがとっても簡単になったので、インタラクション周りの実装に時間を注ぐ。そしてバージョンアップリリースまで頑張る。

まずは、Noteの入力UIの改善

問題は二つ

  1. キーボードが表示された状態で、InputViewがスライドできてしまう。
  • 別のViewに移ったら、キーボードを自動で畳むなどしたい。
  • もしくは、キーボードが表示されてる最中は、スライドできないようにする。

ベストなのは後者。

  1. キーボードの確定を押しても、キーボードが出ている状態で、View上のDoneを押しただけでは反映されない。
  • 現状の実装として、画面上をタップして、キーボードからフォーカスが外れたタイミングで、dailylog.noteのプロパティに、入力内容を代入するようにしている。
  • 上記だけでは足りなくて、キーボードの確定で、代入できるようにしなければいけない。

ただ、キーボードの確定が上手くキャッチできない。onSubmitが動かんのよ。。

satomilkysatomilky

InputScreensで、タブ切り替えするタイミングで、適切なタイミングでキーボードを出したり閉じたりさせる。

ここから左にスライドさせると。。

まだキーボードが出ちゃってる。ダメだこりゃ。

FocusStateのバインディングが必要。
https://developer.apple.com/forums/thread/682448

Hidden comment
satomilkysatomilky

もしくは、キーボードが表示されてる最中は、スライドできないようにする。

これをやるか。。

satomilkysatomilky

しょうがないのでUIフロー自体を変えることにした。

そもそもFirestoreをもう使ってないので、InputView自体は、
アクションした段階で、保存処理をすればいいのであるけど、
テキスト系だけはDoneを検知しなくちゃいけないので。。。

satomilkysatomilky

上の案は本末転倒な感じがしたのでFigmaファイルをいじろうとしたところでやめました。
9:00までやる。

と言うのも、まさに試したい解決方法を発見したので。

https://youtu.be/Y4Vm61vrhTE?t=1077

satomilkysatomilky

あれ!!上のやつ、よく見たら、横スライドなんだけど、TabViewじゃない。ScrollView(.horizontal) で実装されてる。。

satomilkysatomilky

だけど、 isShowingKeyboard のプロパティ生やすところとか一緒だな。
なるほど。NotificationCenter 使うのか。(AppleDocument検索したときに、なんでこのAPIに気づかなかったのだろう。。

と思ったら、UIKitのAPIだったか。。

satomilkysatomilky

上の形で、キーボードの表示を検知しても、同じことが起こった。
多分、TabView.disabled()が動いてないな。。

satomilkysatomilky

もうキーボードを表示させてる時にTabViewで他のTabに移動できなくさせる処理は諦めた。
なので、Note以外のViewに遷移した時に、Focusを外す。という当初の処理に戻す。

が、消える時のアニメーション処理がダサすぎて。な
https://youtu.be/DAO4l3hU7FE

satomilkysatomilky

もうダメだな。私の知識では解決無理だ。諦めよう。

TabViewの時だけ、キーボードを表示させた時に、TabView.disabledが効かない。と言うことで。
(ミニマムな基本構造だけのプロトタイプで実証した時にも同じことが起こってるからこれはもう既存のバグだわ。。)

https://stackoverflow.com/questions/67213145/swiftui-input-field-keyboard-animation-causing-other-views-in-tab-view-to-anim

https://developer.apple.com/forums/thread/662250

satomilkysatomilky

しばらく、夜のコーディング作業はお肌と体調によくないと思って(やさぐれて)放置しておりましたが、上記の問題を解決するのは諦めて、UIフローそのものを変更することで行こうと思います。

それにしても、今回の件は、デザインと実装を私が一人だけでやってるから、こう言う判断がすばやくできるものの(とはいえ諦めきれずに少々粘ってしまったが。)、
デザイナーとエンジニアで別れていたりするとこの辺りのコミュニケーションってどうやって円滑に取りつつ、スピード優先で動けるんだろうな。。と思う事案です。

でも、今回は私も、できれば解決したかった。想定したUIフローを実現したかった。。

割と、実装詰まると「UIの方を調整すっかー」ってすぐに気持ち切り替えるタイプだけど、
今回だけはUIを諦めると、明らかに冗長な感じのUIフローになるので本当に嫌だったのよぉ。

ので絶賛気持ちが萎えてますw

satomilkysatomilky

書いてなかったんだけど、UIフローを変えてこのタスク自体は完了してます。

一回、普通にこんなふうにしてたんだけど、
https://youtube.com/shorts/jWMX7l2A0TY
デイリーのDoneと、NoteのDoneが被ってるのが気になって、
その後、デイリーのDoneは無くしてます。

SwiftDataへの保存トリガーは各項目を更新したら即反映みたいなUIになりました。
https://youtube.com/shorts/lUh9eWv1bBc

というわけで、このスクラップは以上でクローズです。

このスクラップは2023/09/07にクローズされました