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