2014年4月30日水曜日

UIScrollViewDelegateの実装とスクロールイベントの通知について(iOS)

UIScrollViewクラスにはそのスクロールイベント等を通知するdelegateが定義されており、 プロトコル UIScrollViewDelegate として定義されています。 delegateの各メソッドが呼び出されるタイミングについて、以下にまとめたいと思います。
UIScrollViewDelegateの用途
そもそもUIScrollViewDelegateは何のために使われるのでしょうか?よくUITableViewControllerを利用しているアプリでNavigationBarやToolBarがスクロールに応じて表示/非表示されるものがありますが、そのようにスクロールのイベントに応じて何かしらのアクションを実行したい場合に利用出来ます。
UIScrollViewDelegateプロトコル
UIScrollViewDelegateには大きく
  • スクロール、ドラッグ関連のメソッド
  • ズーム管理に関するメソッド
が定義されていますが、本記事ではスクロール、ドラッグ関連のメソッドについてのみ記載しています。
以下、UIScrollDelegateプロトコルに定義されているメソッドについてスクロール状況に伴う通知タイミングをまとめました。

UIScrollViewDelegate protocol methodの通知タイミング
メソッド名 通知タイミング
- (void)scrollViewDidScroll:(UIScrollView *)scrollView スクロールが発生すると呼び出される。スクロール中は常に呼び出されます。
- (BOOL)scrollViewShouldScrollToTop:(UIScrollView *)scrollView ステータスバーをタップしてViewの先頭にスクロールが発生する前に呼び出される
※本メソッドには戻り値がありYESを返却するとスクロールが発生して、もしNOを返却した場合はスクロールが発生しません。
- (void)scrollViewDidScrollToTop:(UIScrollView *)scrollView ステータスバーをタップして先頭にスクロールが完了した後に呼び出される。
- (void)scrollViewWillBeginDragging:(UIScrollView *)scrollView ドラッグしてスクロールが発生する直前に呼び出される。
- (void)scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate ドラッグ完了後に呼び出される。慣性スクロールしていてもドラッグを止めた時点で呼び出されます。
- (void)scrollViewWillBeginDecelerating:(UIScrollView *)scrollView スクロールが発生して、慣性スクロールの減速が始まる直前に呼び出される。ほぼドラッグ完了後の通知と同じタイミングで通知されます。(こちらの通知が若干遅い)
- (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView 慣性スクロールの減速が止まった時。つまりスクロールが停止した時に呼び出されます。
タイミングが分かり難いので、以下に時系列で通知タイミングを表した図を書いてみました。
UIScrollViewDelegateの設定
TableViewの場合はUITableViewDelegateがUIScrollViewDelegateを採用しているので、UITableVIewDelegateを設定することで同時にUIScrollviewDelegateを設定することになります。
以下UITableViewControllerの実装クラスでdelegateを設定する場合の例です。UITableViewのdelegateに設定します。
    //scrollview delegate
    self.tableView.delegate = (id)delegate;
コードの詳細は以下のサンプルアプリのソースコードをGitHubにあげているので、そちらを参照して下さい。
UIScrollViewDelegateの通知タイミングを知らせるサンプル・アプリケーション
UIScrollViewDelegateを採用して通知タイミングを知らせるサンプルアプリを作りました。各メソッドが呼び出されると呼び出されたタイミングでインジケータが光るようなアプリです。
微妙な通知タイミングがこのアプリで分かると思います。(スクリーンショットじゃ分からないと思いますので、ダウンロードしてお試し下さい)
以下スクリーンショット。

以下にソースコードを公開しているので、コード等参考にして下さい。
UIScrollViewDelegateIndicator on GitHub.

0 件のコメント :

コメントを投稿