web-dev-qa-db-ja.com

Swiftでスワイプバックジェスチャーを無効にします

ここをしばらく見て回っていますが、有効な解決策が見つからないようです。

Swiftで、スワイプを無効にして前の表示ジェスチャーに戻るようにしています。

以下を含むさまざまなソリューションを試しました。

self.navigationController?.interactivePopGestureRecognizer.enabled = false

そして

self.navigationController.interactivePopGestureRecognizer.delegate = self

func gestureRecognizerShouldBegin(gestureRecognizer: UIGestureRecognizer!) -> Bool {
    return false
}

これを行う新しい方法や、機能する他の方法はありますか?

59
Phil Hudson

これを無効にすることもできますが、ほとんどのiOSユーザーはスワイプで戻ることができ、戻るボタンを押すと少なくなりますので、お勧めできません。無効にしたい場合は、それほど大きな転送ではないプッシュセグエの代わりにmodal segueを使用する方が合理的です。スワイプで戻る機能を本当に取り除きたい場合は、戻るボタンを無効にし、画面の右上に完了ボタンを配置します。

self.navigationController?.navigationItem.backBarButtonItem?.isEnabled = false;
12
Stefan DeClerck

以下は、スワイプバックを無効化および再有効化する簡単な方法です。

Swift 3.x以降

ViewDidLoad/willAppear/didAppearメソッドに以下を追加します。

navigationController?.interactivePopGestureRecognizer?.isEnabled = false

viewDidLoadでこれを行うと、次にビューを開いたときに、スタックに残っているかどうかによって設定されない場合があることに注意してください。

オフのままにしたくない場合は、willMove(toParentViewController:)またはwillDisappearのいずれかを使用してビューを閉じたときにオンに戻す必要があります。 navigationControllerviewDidDisappearでnilになるため、手遅れです。

navigationController?.interactivePopGestureRecognizer?.isEnabled = true

SplitViewControllersに関する特別な注意:

CompCがコメントで指摘したように、2番目のNavigation Controllerを呼び出して、詳細ビューに適用する必要があります。

navigationController?.navigationController?.interactivePopGe‌​stureRecognizer?.isE‌​nabled = false

Swift 2.2&Objective-C

Swiftバージョン2.x以下:

navigationController?.interactivePopGestureRecognizer?.enabled

Objective-C:

self.navigationController.interactivePopGestureRecognizer.enabled
122
CodeBender

GestureRecognizerShouldBeginでfalseを返すことでこれを行うことができました

class ViewController2: UIViewController, UIGestureRecognizerDelegate {
...
override func viewDidLoad() {
    super.viewDidLoad()
    // Do any additional setup after loading the view.
    self.navigationController?.interactivePopGestureRecognizer.delegate = self
}

func gestureRecognizerShouldBegin(gestureRecognizer: UIGestureRecognizer) -> Bool {
    return false
}
18
Hari Kunwar

HariまたはStefanからの回答に問題はありませんが、これはより簡潔です。 viewDidLoadに配置するだけで完了です。

if navigationController!.respondsToSelector(Selector("interactivePopGestureRecognizer")) {
    navigationController!.view.removeGestureRecognizer(navigationController!.interactivePopGestureRecognizer)
}

編集:

小さな注意点の1つは、Navigation Controllerが別のビューによって開かれ、Navigation Controllerが閉じられると、EXC_BAD_ACCESSエラーが発生することです。これを修正するには、元のUIGestureRecognizerを保存し、ビューを終了したときに元に戻す必要があります。

宣言:

private var popGesture: UIGestureRecognizer?

ジェスチャーを削除する直前:

popGesture = navigationController!.interactivePopGestureRecognizer

次に、ビューを閉じるとき:

If popGesture != nil {
    navigationController!.view.addGestureRecognizer(popGesture!)
}
5
RowanPD

目的のために-c

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

  self.navigationController.interactivePopGestureRecognizer.enabled = NO;

}
3
Maulik Patel

Swift 4に対するRowanPDのロジック

private var popGesture: UIGestureRecognizer?

override func viewDidAppear(_ animated: Bool) {
    super.viewDidAppear(animated)

    if navigationController!.responds(to: #selector(getter: UINavigationController.interactivePopGestureRecognizer)) {
        self.popGesture = navigationController!.interactivePopGestureRecognizer
        self.navigationController!.view.removeGestureRecognizer(navigationController!.interactivePopGestureRecognizer!)
    }

}

override func viewWillDisappear(_ animated: Bool) {
    super.viewWillDisappear(animated)

    if let gesture = self.popGesture {
        self.navigationController!.view.addGestureRecognizer(gesture)
    }

}
2
David Seek

私は通常、可能な限り多くの場所でスワイプバックが有効になっていることを確認し、カスタムジェスチャレコグナイザーを追加してモーダルスクリーンに追加します。ただし、アプリの認証およびダウンロードプロセスでは、モーダルナビゲーションコントローラーでプロセスを開始し、次の各ステップでビューをプッシュします。ただし、完了したら、認証画面にバックアップされないようにします。

このシナリオでは、私が使用してきました:

navigationController?.interactivePopGestureRecognizer?.isEnabled = false
navigationItem.hidesBackButton = true

最終画面のviewWillAppear()で。別のビューをプッシュし、そこで必要な場合は、viewWillDisappear()でこれらを元に戻すことができます。

2
blwinters

画面の一部にサイドメニューを表示することが要件である場合、navigationControllerビューではなく、この特定のビューにAddScreenEdgePanGestureを追加します。

それを交換してください

SideMenuManager.default.menuAddScreenEdgePanGesturesToPresent(toView: self.navigationController?.view)

これとともに

SideMenuManager.default.menuAddScreenEdgePanGesturesToPresent(toView: self.view)
0
Spydy

これは、すべて試してみてもうまくいかない場合に見逃したものです。

  1. navigationController?.interactivePopGestureRecognizer?.isEnabled = falseをviewWillAppear(animated :)メソッドに追加します。
  2. 動作しない場合は、View ControllerからNavigation Delegateを削除します。 View ControllerがUINavigationControllerDelegateUIGestureRecognizerDelegateプロトコルを確認しているか再度確認してください。その場合は、削除してください。
0
Li Jin