web-dev-qa-db-ja.com

iOS 7の戻るボタンのポップジェスチャー

IOS 7では、スワイプからポップへの新しいジェスチャーがあります。画面の左側を左から右にスワイプすると、UINavigationControllerが前の画面に戻りますUIViewController

このようなカスタムの戻るボタンを作成すると、スワイプしてポップするジェスチャーが機能しなくなります。

UIBarButtonItem *customBackButton = [[UIBarButtonItem alloc] initWithTitle:@" " style:UIBarButtonItemStyleBordered target:self action:@selector(navigateBack)];
[customBackButton setBackButtonBackgroundImage:barBackBtnImg forState:UIControlStateNormal barMetrics:UIBarMetricsDefault];
[customBackButton setBackButtonBackgroundImage:barBackBtnImgHighlighted forBarMetrics:UIBarMetricsDefault];
self.navigationItem.backBarButtonItem = customBackButton;

カスタムの戻るボタンを使用して、ネイティブのスワイプでポップジェスチャーを使用するにはどうすればよいですか?

更新:

それがnavigateBackで起こっていることです:

- (void)navigateBack {
    [self.navigationController popViewControllerAnimated:YES];
}
16
dlinsin

次のコード行を追加するだけです。

[self.navigationController.interactivePopGestureRecognizer addTarget:self action:@selector(handleGesture:)];

独自のUIGestureRecognizerを追加して、UIViewControllerを自分でポップできます。詳細は docs を参照してください。

13
prizzl

独自のジェスチャー認識機能を追加する必要はありません。 UINavigationControllerはすでにそれを行います。有効にする前に、interactivePopGestureRecognizerのデリゲートを設定する必要があります。

次の2つのことを行います。

self.navigationController.interactivePopGestureRecognizer.delegate = (id<UIGestureRecognizerDelegate>)self;
[self.navigationController.interactivePopGestureRecognizer setEnabled:YES];
35
udit gupta

私が使う

[[UINavigationBar appearance] setBackIndicatorImage:[UIImage imageNamed:@"nav_back.png"]];
[[UINavigationBar appearance] setBackIndicatorTransitionMaskImage:[UIImage imageNamed:@"nav_back.png"]];

[UIBarButtonItem.appearance setBackButtonTitlePositionAdjustment:UIOffsetMake(0, -64) forBarMetrics:UIBarMetricsDefault];
3
Albert Chu

クラッシュを回避するには、カスタムバックセレクターを追加および削除する方法に注意する必要があります。その理由は、ポップコントローラーを押している間、ナビゲーションコントローラーがそのまま残るためです。カスタムの戻るボタン+セレクターを追加した後で既に述べたように、viewDidApearで次のことを行う必要があります。

    if ([self.navigationController respondsToSelector:@selector(interactivePopGestureRecognizer)])
    {
       self.navigationController.interactivePopGestureRecognizer.enabled = YES;
       self.navigationController.interactivePopGestureRecognizer.delegate = (id<UIGestureRecognizerDelegate>)self;
       [self.navigationController.interactivePopGestureRecognizer addTarget:self action:@selector(navigateBack)];
    }

次に、viewWillDisapearで

        if ([self.navigationController respondsToSelector:@selector(interactivePopGestureRecognizer)])
        {
           [self.navigationController.interactivePopGestureRecognizer removeTarget:self action:@selector(performCompletion)];
        }

これらの呼び出しのタイミングが重要です。それ以外の場合はクラッシュする可能性があります。理由については here で詳細を参照してください

2
Zeev Vax

新しいジェスチャー認識機能UIScreenEdgePanGestureRecognizerがあります。ビューとハンドルにそれぞれ追加して(navigateBackを呼び出す)、ビューコントローラーのナビゲーション動作を複製できます。

1
YuliaSh.

「navigateBack」で何をしましたか?

この方法を次のように使用します。

- (void)navigateBack
{
    [self.navigationController popViewControllerAnimated:YES];
}
0
Jordan Montel

これをカスタムの戻るボタンself.navigationController.interactivePopGestureRecognizer.delegate =(id)self;に追加してみてください。