web-dev-qa-db-ja.com

UINavigationControllerインタラクティブポップジェスチャが機能しない場合

そのため、iOS 7アプリ用に作成したナビゲーションコントローラーがあります。 titleViewが表示され、戻るボタンとナビゲーションバーも表示されます。何らかの理由で、インタラクティブなポップジェスチャ(左端からのスワイプ)が機能しません。何も起こりません。ジェスチャーを記録するとき、それはゼロではありません。この機能を有効にするために特別なことはありますか?何が機能しないのでしょうか?

25
Aaron Wojnowski

ええ、ジェスチャデリゲートを設定し、以下を実装する必要があったようです。

-(BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer {

    return YES;

}
26
Aaron Wojnowski

カスタムの戻るボタンを使用すると、インタラクティブなポップジェスチャが機能しなくなることがわかりました(私の考えでは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
    }

}
48
Eneko Alonso

これを見てください response とコメント。必要なのは、Navigation Controllerのインタラクティブなポップジェスチャレコグナイザーのデリゲートをnilに設定することだけです。

self.navigationController.interactivePopGestureRecognizer.delegate = nil;

プロトコルのすべてのメソッドはオプションであるため、id<UIGestureRecognizerDelegate>へのキャストされたselfへの設定も機能しますが、この場合はデリゲートをnilに設定する方が適切だと思います。

18
cromandini

この行をviewDidLoadメソッドに入れることができます。

self.navigationController.interactivePopGestureRecognizer.delegate = (id<UIGestureRecognizerDelegate>)self;
12
lojals

よりよく答えられたのは、アーロンとロジャースの両方でした

最初にNavigation Controllerをカスタマイズしてから、このコードをクラスに配置します

ViewDidloadに次の行を追加します。

self.navigationController.interactivePopGestureRecognizer.delegate = (id<UIGestureRecognizerDelegate>)self;

そしてクラスでこの関数を書く

-(BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer { return YES;}
5
Vicky Dhas

たぶん誰かがこれを役に立つと思うかもしれません。

ナビゲーションバーを非表示にし、通常のスワイプジェスチャを使用して戻るなどのナビゲーションコントローラー機能を使用する場合は、(-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)
}
2
Doca

Swift 4、View Controller内にUITableViewがあり、この問題を次のように解決しました:

override func viewDidLoad() {
    super.viewDidLoad()
    self.navigationController?.interactivePopGestureRecognizer?.delegate=nil
}
1
user4838524

私の答えは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
    }
}
1
Kukiwon

アプリ全体にインタラクティブなポップジェスチャを一般的に追加します。

[〜#〜] xcode [〜#〜]:9.0、Swift:4.0

できれば、AppDelegate.SwiftでUINavigationControllerを作成してください

  1. Navigation Controllerを作成する
// I created a global variable, however not necessarily you will be doing this way
var nvc: UINavigationController!
  1. UIGestureRecognizerDelegateを実装する
class AppDelegate: UIResponder, UIApplicationDelegate, UIGestureRecognizerDelegate {
  1. アプリケーションのdidFinishLaunchingWithOptions関数のInstantiat UINavigationController
nvc=UINavigationController()

// For interactive pop gesture
nvc.navigationBar.isHidden=true
nvc?.interactivePopGestureRecognizer?.delegate=self
  1. 追加の手順、アプリケーションdidFinishLaunchingWithOptions関数でナビゲーションコントローラーにコントローラーを追加
window=UIWindow()
window?.rootViewController=nvc
window?.makeKeyAndVisible()

// BaseViewController is sample controller i created with xib
nvc.pushViewController(BaseViewController(), animated: true)
  1. Gusture Recognizerを実装し、AppDelegate.Swiftに以下のコードを追加します
func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer, shouldRequireFailureOf otherGestureRecognizer: UIGestureRecognizer) -> Bool {
        return true
    }



注:違いについては、このセクションの他の記事を参照

self.navigationController?.navigationBar.isHidden=true

そして

self.navigationController?.isNavigationBarHidden = true
0
Rakesh Yembaram