web-dev-qa-db-ja.com

ナビゲーションバーが非表示の場合、UINavigationContollerinteractivePopGestureRecognizerは非アクティブです

UINavigationController内にネストされたViewControllerがあります。

IOS 7のinteractivePopGestureRecognizerを実装して、ユーザーがジェスチャーでVCをスタックからポップできるようにしました。

VC内にスクロールビューがあり、ユーザーがスクロールビューの上部にいない間は、すべてのchrome(ナビゲーションバーとステータスバー)を非表示にします。コンテンツに焦点を当てます。

ただし、ナビゲーションバーが非表示になっていると、interactivePopGestureRecognizerは機能しません。

消えてから有効にしてみましたが、nilでないことを確認しましたが、それでも機能しません。

足りないものはありますか?

18
Dan

UIViewControllerサブクラスをgestureRecognizerのデリゲートとして設定します。

self.navigationController.interactivePopGestureRecognizer.delegate = self;

それでおしまい!

37
simonmaddox

簡単な解決策

ナビゲーションコントローラーを介さずに、ナビゲーションバーの非表示プロパティを設定するだけです

これらの2行を使用するだけです

self.navigationController.navigationBarHidden = NO;
self.navigationController.navigationBar.hidden = YES;
16
Nagaraj

これを使いました。 self.navigationController.interactivePopGestureRecognizer.delegate = self;

また、UINavigationControllerクラスで、遷移中にinteractivePopGestureRecognizerを無効にします。

- (void)pushViewController:(UIViewController *)viewController
              animated:(BOOL)animated
{
    if ([self respondsToSelector:@selector(interactivePopGestureRecognizer)]) {
        self.interactivePopGestureRecognizer.enabled = NO;
}

    [super pushViewController:viewController animated:animated];
}

- (void)navigationController:(UINavigationController *)navigationController
       didShowViewController:(UIViewController *)viewController
                    animated:(BOOL)animated
{
    if ([navigationController respondsToSelector:@selector(interactivePopGestureRecognizer)]) {
        // disable interactivePopGestureRecognizer in the rootViewController of navigationController
        if ([[navigationController.viewControllers firstObject] isEqual:viewController]) {
            navigationController.interactivePopGestureRecognizer.enabled = NO;
        } else {
            // enable interactivePopGestureRecognizer
            navigationController.interactivePopGestureRecognizer.enabled = YES;
        }
    }
}

rootViewControllerでinteractivePopGestureRecognizerを無効にする理由は、rootViewControllerでEdgeからスワイプし、何かをタップして次のviewControllerをプッシュすると、UIはタッチを受け入れなくなります。ホームボタンを押してアプリをバックグラウンドに配置し、タップして入力します。前景...

7
hellkernel

これは私にはうまくいかないようです。キースルのブログ投稿をフォローしました。それもうまくいきませんでした。

私は最終的にUISwipeGestureRecognizerで解決しました。それはそれが言うことをしているようです。

UISwipeGestureRecognizer *gestureRecognizer = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(backButtonPressed:)];
[gestureRecognizer setDirection:(UISwipeGestureRecognizerDirectionRight)];
[self.navigationController.view addGestureRecognizer:gestureRecognizer];
3
ThefunkyCoder

これらの2行を-(void)viewDidAppear:(BOOL)animatedに追加するとうまくいきました。

self.navigationController.navigationBarHidden = NO;
self.navigationController.navigationBar.hidden = YES;

そして、<UIGestureRecognizerDelegate>.hファイルに呼び出すことを忘れないでください。

0
Vaibhav Saran