1. ホーム
  2. ios

[解決済み] フォーム/ページシートのモーダル表示をプルダウンで表示するジェスチャーを無効にする

2023-01-16 16:58:44

質問

iOS 13 では、フォームおよびページ シート スタイルを使用するモーダル プレゼンテーションは、パンダウン ジェスチャで閉じることができます。私のフォーム シートの 1 つでは、ユーザーがこのボックスに描画するとジェスチャが妨害されるため、これが問題になります。これは、垂直線を描く代わりに画面を下に引っ張ってしまいます。

シートとして表示されるモーダルビューコントローラーで、垂直方向のスワイプによるジェスチャーを無効にするにはどうしたらよいでしょうか。

設定方法 isModalInPresentation = true を設定しても、シートは引き下ろされることができますが、解任されることはありません。

どのように解決するのですか?

一般に、ユーザーはすべてのアプリですべてのフォーム/ページ シートが同じ動作をすることを期待しているので、スワイプして閉じる機能を無効にしようとするべきではありません。代わりに、フルスクリーンのプレゼンテーション スタイルを使用することを検討するとよいでしょう。スワイプで解除できないシートを使用したい場合は、フォーム/ページシートに isModalInPresentation = true を設定しますが、この場合でもシートを垂直に引き下げることができ、タッチを離すと跳ね上がることに注意してください。また UIAdaptivePresentationControllerDelegate をチェックしてください。 のドキュメントをチェックして、ユーザーがスワイプでそれを解除しようとしたときに反応するようにしてください。

アプリのジェスチャまたはタッチ処理がスワイプによる却下機能によって影響を受けるシナリオがある場合、それを修正する方法について Apple のエンジニアからいくつかの助言をもらいました。

システムのパン ジェスチャーの認識機能が開始されないようにすれば、ジェスチャーの破棄を防ぐことができます。これを行うには、いくつかの方法があります。

  1. キャンバスの描画にジェスチャー認識機能を使用している場合、たとえば、独自の UIGestureRecognizer サブクラスに入力します。 began フェーズに入ります。と同じくらい早く認識すれば UIPanGestureRecognizer と認識すれば、あなたの勝ちとなり、シートの剥離ジェスチャーは無効になります。

  2. canvas の描画がジェスチャー認識機能で行われる場合、動的な失敗の要件をセットアップして -shouldBeRequiredToFailByGestureRecognizer: (または関連するデリゲートメソッド) を使用して、動的な失敗の要件を設定します。 NO 渡されたジェスチャー認識器が UIPanGestureRecognizer .

  3. キャンバス描画が手動タッチ操作で行われる場合(例えば touchesBegan: など)、オーバーライド -gestureRecognizerShouldBegin をオーバーライドし、タッチハンドリングビューで NO を返し、渡されたジェスチャー認識ツールが UIPanGestureRecognizer .

私のセットアップでは、#3 が非常にうまく機能することが証明されました。これは、ユーザーがシートを移動せずに描画できるようにしながら、描画キャンバスの外側の任意の場所をスワイプダウンして (ナビ バーのように) 閉じることができ、期待どおりに動作しました。

ジェスチャを無効化するために見つけようとすることはお勧めできません。これは、かなり動的で、たとえば異なるサイズ クラス間で切り替えたときにそれ自体を再度有効にできるようで、これは将来のリリースで変わる可能性があるからです。