ここをしばらく見て回っていますが、有効な解決策が見つからないようです。
Swiftで、スワイプを無効にして前の表示ジェスチャーに戻るようにしています。
以下を含むさまざまなソリューションを試しました。
self.navigationController?.interactivePopGestureRecognizer.enabled = false
そして
self.navigationController.interactivePopGestureRecognizer.delegate = self
func gestureRecognizerShouldBegin(gestureRecognizer: UIGestureRecognizer!) -> Bool {
return false
}
これを行う新しい方法や、機能する他の方法はありますか?
これを無効にすることもできますが、ほとんどのiOSユーザーはスワイプで戻ることができ、戻るボタンを押すと少なくなりますので、お勧めできません。無効にしたい場合は、それほど大きな転送ではないプッシュセグエの代わりにmodal segue
を使用する方が合理的です。スワイプで戻る機能を本当に取り除きたい場合は、戻るボタンを無効にし、画面の右上に完了ボタンを配置します。
self.navigationController?.navigationItem.backBarButtonItem?.isEnabled = false;
以下は、スワイプバックを無効化および再有効化する簡単な方法です。
Swift 3.x以降
ViewDidLoad/willAppear/didAppearメソッドに以下を追加します。
navigationController?.interactivePopGestureRecognizer?.isEnabled = false
viewDidLoad
でこれを行うと、次にビューを開いたときに、スタックに残っているかどうかによって設定されない場合があることに注意してください。
オフのままにしたくない場合は、willMove(toParentViewController:)
またはwillDisappear
のいずれかを使用してビューを閉じたときにオンに戻す必要があります。 navigationController
はviewDidDisappear
でnilになるため、手遅れです。
navigationController?.interactivePopGestureRecognizer?.isEnabled = true
SplitViewControllersに関する特別な注意:
CompCがコメントで指摘したように、2番目のNavigation Controllerを呼び出して、詳細ビューに適用する必要があります。
navigationController?.navigationController?.interactivePopGestureRecognizer?.isEnabled = false
Swift 2.2&Objective-C
Swiftバージョン2.x以下:
navigationController?.interactivePopGestureRecognizer?.enabled
Objective-C:
self.navigationController.interactivePopGestureRecognizer.enabled
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
}
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!)
}
目的のために-c
-(void)viewWillAppear:(BOOL)animated{
[super viewWillAppear:true];
self.navigationController.interactivePopGestureRecognizer.enabled = NO;
}
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)
}
}
私は通常、可能な限り多くの場所でスワイプバックが有効になっていることを確認し、カスタムジェスチャレコグナイザーを追加してモーダルスクリーンに追加します。ただし、アプリの認証およびダウンロードプロセスでは、モーダルナビゲーションコントローラーでプロセスを開始し、次の各ステップでビューをプッシュします。ただし、完了したら、認証画面にバックアップされないようにします。
このシナリオでは、私が使用してきました:
navigationController?.interactivePopGestureRecognizer?.isEnabled = false
navigationItem.hidesBackButton = true
最終画面のviewWillAppear()
で。別のビューをプッシュし、そこで必要な場合は、viewWillDisappear()
でこれらを元に戻すことができます。
画面の一部にサイドメニューを表示することが要件である場合、navigationControllerビューではなく、この特定のビューにAddScreenEdgePanGestureを追加します。
それを交換してください
SideMenuManager.default.menuAddScreenEdgePanGesturesToPresent(toView: self.navigationController?.view)
これとともに
SideMenuManager.default.menuAddScreenEdgePanGesturesToPresent(toView: self.view)
これは、すべて試してみてもうまくいかない場合に見逃したものです。
navigationController?.interactivePopGestureRecognizer?.isEnabled = false
をviewWillAppear(animated :)メソッドに追加します。UINavigationControllerDelegate
、UIGestureRecognizerDelegate
プロトコルを確認しているか再度確認してください。その場合は、削除してください。