そのため、iOS 7アプリ用に作成したナビゲーションコントローラーがあります。 titleViewが表示され、戻るボタンとナビゲーションバーも表示されます。何らかの理由で、インタラクティブなポップジェスチャ(左端からのスワイプ)が機能しません。何も起こりません。ジェスチャーを記録するとき、それはゼロではありません。この機能を有効にするために特別なことはありますか?何が機能しないのでしょうか?
ええ、ジェスチャデリゲートを設定し、以下を実装する必要があったようです。
-(BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer {
return YES;
}
カスタムの戻るボタンを使用すると、インタラクティブなポップジェスチャが機能しなくなることがわかりました(私の考えではAppleはカスタムの戻るボタンの動作を予測できないため、ジェスチャが無効になります)。
これを修正するには、前述したように、interactivePopGestureRecognizer.delegate
プロパティをnil
に。
Swiftでは、 これは、次のように:UINavigationController
の拡張子を追加することで、アプリケーション全体で簡単に実行できます
extension UINavigationController {
override public func viewDidLoad() {
super.viewDidLoad()
interactivePopGestureRecognizer?.delegate = nil
}
}
回答の更新
デリゲートをnil
に設定すると、一部のシナリオでアプリのUIがフリーズするようです(たとえば、ユーザーがナビゲーションスタックのトップビューコントローラーを左右にスワイプした場合)。
gestureRecognizerShouldBegin
デリゲートメソッドは拡張機能で処理できないため、UINavigationController
をサブクラス化することが最良の解決策のようです。
class NavigationController: UINavigationController, UIGestureRecognizerDelegate {
/// Custom back buttons disable the interactive pop animation
/// To enable it back we set the recognizer to `self`
override func viewDidLoad() {
super.viewDidLoad()
interactivePopGestureRecognizer?.delegate = self
}
func gestureRecognizerShouldBegin(gestureRecognizer: UIGestureRecognizer) -> Bool {
return viewControllers.count > 1
}
}
これを見てください response とコメント。必要なのは、Navigation Controllerのインタラクティブなポップジェスチャレコグナイザーのデリゲートをnil
に設定することだけです。
self.navigationController.interactivePopGestureRecognizer.delegate = nil;
プロトコルのすべてのメソッドはオプションであるため、id<UIGestureRecognizerDelegate>
へのキャストされたselfへの設定も機能しますが、この場合はデリゲートをnil
に設定する方が適切だと思います。
この行をviewDidLoadメソッドに入れることができます。
self.navigationController.interactivePopGestureRecognizer.delegate = (id<UIGestureRecognizerDelegate>)self;
よりよく答えられたのは、アーロンとロジャースの両方でした
最初にNavigation Controllerをカスタマイズしてから、このコードをクラスに配置します
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
アップデート7-DEC-2018:
最初のコントローラーが非表示のナビゲーションバーを使用し、次の子がナビゲーションバーを使用する場合、ベースビューコントローラーに戻ると、ナビゲーションバーの代わりに遷移中に黒いバーが表示されます。最初のviewcontroller(father)で使用する場合、これは非常に簡単に修正されます:
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
}
私の答えはEnekoの答えに基づいていますが、UINavigationControllerの拡張機能のみを使用し、Swift 5:
extension UINavigationController: UIGestureRecognizerDelegate {
override open func viewDidLoad() {
super.viewDidLoad()
interactivePopGestureRecognizer?.delegate = self
}
public func gestureRecognizerShouldBegin(_ gestureRecognizer: UIGestureRecognizer) -> Bool {
return viewControllers.count > 1
}
}
アプリ全体にインタラクティブなポップジェスチャを一般的に追加します。
[〜#〜] xcode [〜#〜]:9.0、Swift: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
nvc=UINavigationController()
// For interactive pop gesture
nvc.navigationBar.isHidden=true
nvc?.interactivePopGestureRecognizer?.delegate=self
window=UIWindow()
window?.rootViewController=nvc
window?.makeKeyAndVisible()
// BaseViewController is sample controller i created with xib
nvc.pushViewController(BaseViewController(), animated: true)
func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer, shouldRequireFailureOf otherGestureRecognizer: UIGestureRecognizer) -> Bool {
return true
}
注:違いについては、このセクションの他の記事を参照
self.navigationController?.navigationBar.isHidden=true
そして
self.navigationController?.isNavigationBarHidden = true