ステータスバーをタップしたら一番上にスクロールするアプリはよくありますし簡単に実装できます。しかしこれを「途中に」スクロールしたい場合が、ごくごく稀にあります。今日そんな場面に遭遇して調べたので、まとめておきます。
そもそもステータスバーをタップしたら、何がどう動くのか
UIScrollViewやUITableViewは、scrollsToTopというプロパティを持っています。このプロパティは、「scroll-to-top gestureが行われた時に一番上にスクロールするか」をBOOL型で設定します。scroll-to-top gestureはステータスバーをタップする事のようです。(UIScrollView Class ReferenceのscrollsToTopを参照)。
このプロパティがYES(デフォルト)の場合、delegateのメソッド- (BOOL)scrollViewShouldScrollToTop:(UIScrollView *)scrollView
が呼ばれ、本当にスクロールするのかどうかをYES/NOで受け取り動作します。プロパティがNOの場合は、delegateメソッドは呼ばれません。
このdelegateメソッドがYESを返せば、システム側で上にスクロールしていきます。途中までスクロールさせたい場合は、「戻り値としてはNOを返して」「delegateの中でスクロール」すれば良いのです。
サンプルコード
以下のコードは、UITableViewで「ステータスバーをタップしたら、section=1にスクロールする」場合のdelegate部分の実装です。
#pragma mark - UIScrollViewDelegate
- (BOOL)scrollViewShouldScrollToTop:(UIScrollView *)scrollView
{
// section=1までスクロールする
NSIndexPath *indexPath = [NSIndexPath indexPathForRow:0 inSection:1];
[self.tableView scrollToRowAtIndexPath:indexPath atScrollPosition:UITableViewScrollPositionTop animated:YES];
// システム的な自動スクロールは停止
return NO;
}
UIガイドライン的にはどうか?
正直アプリを申請してみないとわかりません。
iOSヒューマンインタフェースガイドラインの中のステータスバーの箇所を見ても、scroll-to-top gestureやタップ時のアニメーションについての言及はありません。自分が見落としているだけかもしれません。
また、これまで触った事のあるアプリでも、「ステータスバーをタップしたら一番上ではなくて途中にスクロールする」パターンは見た事ありません。
なのでせっかく実装しても審査で落とされてアバーとなるかもしれません。