2015年10月9日金曜日

NavigationBar非表示の左エッジスワイプ


UINavigationControllerは左端からのスワイプで前の画面に戻るが、NavigationBar非表示だと戻らなくなる。画面を覆っているViewがTouchイベントを吸収してしまうからのようです。

その場合は、そのViewにUIScreenEdgePanGestureRecognizerをセットして、自分で前の画面に戻してやればいい。
  • UIViewControllerにUIScreenEdgePanGestureRecognizerをドラッグ&ドロップで追加。
  • ViewからControl+ドラッグでUIScreenEdgePanGestureRecognizerをコネクト。
  • gestureRecognizersに追加する。

  • UIScreenEdgePanGestureRecognizerのプロパティーでLeftをチェック。

  • ViewのプロパティーでUser Interaction Enabledをチェック。

ソースコードの例
最低限の追加はUIScreenEdgePanGestureRecognizerのアクションを受けとるメソッド。
前の画面に戻るので、UIViewControllerに実装するのがよいでしょう。
- (IBAction)handleLeftEdgeGesture:(id)gesture
{
    [self.navigationController popViewControllerAnimated:YES];
}

これをIBでUIScreenEdgePanGestureRecognizerのアクションにセットする。

delegateメソッドは必須ではないが、必要な場合は<UIGestureRecognizerDelegate>をヘッダに追加し(これもなくても動いてしまうが)、適宜delegateメソッドを実装。

ステイタスバーを隠す場合は、UIViewControllerに次のメソッドを追加。
- (BOOL)prefersStatusBarHidden
{
    return YES;
}

NavigationBarを隠すにはUIViewControllerのviewDidLoadなどに次のメソッドを追加。
    [self.navigationController setNavigationBarHidden:YES];

これを行ったあとは前の画面に戻ったときもNavigationBarが隠れたままになるので、そちらでsetNavigationBarHidden:NOに戻す。

ちなみに、UINavigationControllerの左端からのスワイプ動作が都合の悪い時は、次のメソッドで無効にできる。

if ([self.navigationController respondsToSelector:@selector(interactivePopGestureRecognizer)]) {
        self.navigationController.interactivePopGestureRecognizer.enabled = NO;
}

0 件のコメント: