web-dev-qa-db-ja.com

フォーム/ページシートのモーダルプレゼンテーションをプルダウンするジェスチャーを無効にする

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

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

設定isModalInPresentation = trueでもシートを引き下げることができます。却下されることはありません。

55
Jordan H

私、私はこれを使用します:

-(void)viewDidAppear:(BOOL)animated {
[super viewDidAppear:animated];

for(UIGestureRecognizer *gr in self.presentationController.presentedView.gestureRecognizers) {
    if (@available(iOS 11.0, *)) {
        if([gr.name isEqualToString:@"_UISheetInteractionBackgroundDismissRecognizer"]) {
            gr.enabled = false;
        }
    }
}
0

@Jordan Hによってすでに提案されている方法2を詳細に説明しようとします。

1)モーダルシートのパンジェスチャをキャッチして決定できるようにするには、これをビューコントローラのviewDidLoadに追加します。

_navigationController?.presentationController?.presentedView?.gestureRecognizers?.forEach {
   $0.delegate = self
}
_

2)gestureRecognizer(_:shouldRecognizeSimultaneouslyWith:)を使用して、独自のジェスチャーと一緒にパンジェスチャーをキャッチする機能を有効にします

3)実際の決定はgestureRecognizer(_:shouldBeRequiredToFailBy:)で行うことができます

両方とも存在する場合、スワイプジェスチャーがシートのパンジェスチャーよりも優先されるようにするサンプルコード。スワイプジェスチャ認識機能がない領域での元のパンジェスチャには影響しないため、元の "スワイプして閉じる"は設計どおりに機能します。

_extension PeopleViewController: UIGestureRecognizerDelegate {

    func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer, shouldBeRequiredToFailBy otherGestureRecognizer: UIGestureRecognizer) -> Bool {
        if gestureRecognizer === UIPanGestureRecognizer.self && otherGestureRecognizer === UISwipeGestureRecognizer.self {
            return true
        }
        return false
    }

    func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer, shouldRecognizeSimultaneouslyWith otherGestureRecognizer: UIGestureRecognizer) -> Bool {
        return true
    }
}
_

私の場合、スワイプジェスチャレコグナイザは数個しかないので、タイプを比較するだけで十分ですが、それらがさらに多い場合は、ジェスチャレコグナイザ自体(プログラムで追加されたもの、またはインターフェイスビルダのアウトレットとして)を比較するのが理にかなっている可能性があります。このドキュメント: https://developer.Apple.com/documentation/uikit/touches_presses_and_gestures/coordinating_multiple_gesture_recognizers/preferring_one_gesture_over_another

これが私の場合のコードの仕組みです。それがなければ、スワイプジェスチャーはほとんど無視され、たまにしか機能しませんでした。

enter image description here

0
Vitalii