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];
}
次のコード行を追加するだけです。
[self.navigationController.interactivePopGestureRecognizer addTarget:self action:@selector(handleGesture:)];
独自のUIGestureRecognizerを追加して、UIViewControllerを自分でポップできます。詳細は docs を参照してください。
独自のジェスチャー認識機能を追加する必要はありません。 UINavigationControllerはすでにそれを行います。有効にする前に、interactivePopGestureRecognizerのデリゲートを設定する必要があります。
次の2つのことを行います。
self.navigationController.interactivePopGestureRecognizer.delegate = (id<UIGestureRecognizerDelegate>)self;
[self.navigationController.interactivePopGestureRecognizer setEnabled:YES];
私が使う
[[UINavigationBar appearance] setBackIndicatorImage:[UIImage imageNamed:@"nav_back.png"]];
[[UINavigationBar appearance] setBackIndicatorTransitionMaskImage:[UIImage imageNamed:@"nav_back.png"]];
[UIBarButtonItem.appearance setBackButtonTitlePositionAdjustment:UIOffsetMake(0, -64) forBarMetrics:UIBarMetricsDefault];
クラッシュを回避するには、カスタムバックセレクターを追加および削除する方法に注意する必要があります。その理由は、ポップコントローラーを押している間、ナビゲーションコントローラーがそのまま残るためです。カスタムの戻るボタン+セレクターを追加した後で既に述べたように、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 で詳細を参照してください
新しいジェスチャー認識機能UIScreenEdgePanGestureRecognizer
があります。ビューとハンドルにそれぞれ追加して(navigateBack
を呼び出す)、ビューコントローラーのナビゲーション動作を複製できます。
「navigateBack」で何をしましたか?
この方法を次のように使用します。
- (void)navigateBack
{
[self.navigationController popViewControllerAnimated:YES];
}
これをカスタムの戻るボタンself.navigationController.interactivePopGestureRecognizer.delegate =(id)self;に追加してみてください。