56
54

More than 5 years have passed since last update.

スワイプでUIViewControllerを戻る動作

Last updated at Posted at 2013-03-20

最近色んなアプリがスワイプで戻る動作を実装してて、対応していないアプリでもついつい指がスワイプしてしまうので、自分の作るアプリでもコピペで実装できるか調べてみた(大変だったらやりたくない、オープンソースのクラスとかわざわざ入れたくない)。

調べたらやり方は簡単、UIViewControllerのviewDidLoadでUIPanGestureRecognizerを登録、selectorでPanしたx軸の移動距離を見てViewControllerをpopする。

- (void)viewDidLoad
{
    [super viewDidLoad];

    UIPanGestureRecognizer *backGestureRecognizer
        = [[UIPanGestureRecognizer alloc] initWithTarget:self
                                                  action:@selector(backGesture:)];
    [self.view addGestureRecognizer:backGestureRecognizer];
}

- (void)backGesture:(UIPanGestureRecognizer *)sender
{
    CGPoint translation = [sender translationInView:sender.view];
    //閾値を良い感じに調整
    if (60.0 < translation.x) {
        [self.navigationController popViewControllerAnimated:YES];
        [self.view removeGestureRecognizer:sender];
    }
}

スワイプを戻る動作と認識させる閾値は、自分的には60pointくらいが丁度いい(自分がよく使うSmartNewsは52か54pointくらいでやってそう)。

iOS4.0でUIPanGestureRecognizerのtranslationがちゃんとした値を返すのかは未検証。

UIWebViewで使う時

UIWebViewで使う場合、viewの横幅が大きくなりスクロールが必要になるとジェスチャーが認識しないので、cssでbody要素の文字を折り返しさせる。pre要素も要素内でスクロールするようにしておくといい感じ。

body {word-break:break-all;}
pre {overflow:scroll;}

参考

1行で導入するback gestureの話とUINavigationBarを拡張した話
http://blog.ishkawa.org/blog/2013/02/24/backgesture-in-confwd/

UIPanGestureRecognizerはiOS4.0ではtranslationプロパティを正しく返さない
http://akisute.com/2011/08/uipangesturerecognizerios40translation.html

56
54
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
56
54