したがって、iOS 7 アプリ用にビルドしたナビゲーション コントローラーがあります。titleView だけでなく、戻るボタンとナビゲーション バー自体も表示されます。何らかの理由で、インタラクティブ ポップ ジェスチャ (左端からスワイプ) が機能しません。何も起こりません。ジェスチャをログに記録すると、ゼロではありません。この機能を有効にするために何か特別なことはありますか? 動作しない原因は何ですか?
10 に答える
ええと、ジェスチャ デリゲートを設定して、次を実装する必要があったようです。
-(BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer {
return YES;
}
この回答とコメントを見てください。ナビゲーション コントローラーのインタラクティブ ポップ ジェスチャ レコグナイザーのデリゲートをnil
次のように設定するだけです。
self.navigationController.interactivePopGestureRecognizer.delegate = nil;
プロトコルのすべてのメソッドはオプションであるため、キャストされた自己に設定することもできますが、この場合はデリゲートを設定する方が適切id<UIGestureRecognizerDelegate>
だと思います。nil
この行をviewDidLoadメソッドに入れることができます。
self.navigationController.interactivePopGestureRecognizer.delegate = (id<UIGestureRecognizerDelegate>)self;
より練り上げられた答えは、アーロンとロジャースの両方でした
最初にナビゲーション コントローラーをカスタマイズしてから、このコードをクラスに配置します。
ViewDidload に次の行を入れます。
self.navigationController.interactivePopGestureRecognizer.delegate = (id<UIGestureRecognizerDelegate>)self;
そして、クラスでこの関数を書きます
-(BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer { return YES;}
多分誰かがこれが役立つと思うかもしれません。
ナビゲーション バーを非表示にしたいが、通常のスワイプ ジェスチャを使用して戻る場合やその他のナビゲーション コントローラー機能を使用する場合は、次を使用する必要があります: ( navigationBar )
self.navigationController?.navigationBar.isHidden = true
ナビゲーション バーを無効にしたい (ナビゲーション バーを非表示にし、戻るためのスワイプを無効にする) が、viewcontroller をプッシュしたい場合は、次を使用する必要があります: ( isNavigationBarHidden )
self.navigationController?.isNavigationBarHidden = true
2018 年 12 月 7 日更新:
推奨される方法:
最初のコントローラーが非表示のナビゲーション バーを使用し、次の子コントローラーがナビゲーション バーを使用している場合、ベース ビュー コントローラーに戻ると、ナビゲーション バーの代わりに黒いバーが表示されます。最初のviewcontroller(父)で使用すると、これは非常に簡単に修正されます:
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
self.navigationController?.setNavigationBarHidden(true, animated: animated)
}
override func viewWillDisappear(_ animated: Bool) {
super.viewWillDisappear(animated)
self.navigationController?.setNavigationBarHidden(false, animated: animated)
}
Swift 4 では、View Controller 内に UITableView があり、次の方法でこの問題を解決しました。
override func viewDidLoad() {
super.viewDidLoad()
self.navigationController?.interactivePopGestureRecognizer?.delegate=nil
}
一般的に、インタラクティブなポップ ジェスチャをアプリ全体に追加します。
XCODE : 9.0、スイフト: 4.0
できれば AppDelegate.swift に UINavigationController を作成してください
- ナビゲーション コントローラーを作成する
// I created a global variable, however not necessarily you will be doing this way
var nvc: UINavigationController!
- 埋め込む
UIGestureRecognizerDelegate
class AppDelegate: UIResponder, UIApplicationDelegate, UIGestureRecognizerDelegate {
- アプリケーションのインスタンス
UINavigationController
化 didFinishLaunchingWithOptions 関数
nvc=UINavigationController()
// For interactive pop gesture
nvc.navigationBar.isHidden=true
nvc?.interactivePopGestureRecognizer?.delegate=self
- 追加の手順、アプリケーションの didFinishLaunchingWithOptions 関数のナビゲーション コントローラーにコントローラーを追加します。
window=UIWindow()
window?.rootViewController=nvc
window?.makeKeyAndVisible()
// BaseViewController is sample controller i created with xib
nvc.pushViewController(BaseViewController(), animated: true)
- gusture 認識機能を実装し、以下のコードを AppDelegate.swift に追加します
func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer, shouldRequireFailureOf otherGestureRecognizer: UIGestureRecognizer) -> Bool {
return true
}
注: の違いについては、このセクションの他の投稿を参照してください。
self.navigationController?.navigationBar.isHidden=true
と
self.navigationController?.isNavigationBarHidden = true