[XCODE] Pull To Refreshを実現する実装方法
こんにちは、iPhoneアプリ開発を再開した@yoheiMuneです。
今日は、Twitterクライアントとかで良くあるPull To Refreshを実装する方法をブログに記載したいと思います。

例えば、以下のような画面が良く採用されています。

プルリフレッシュを簡単に実現する場合は、Githubで公開されているPullToRefreshを取り入れることで実現出来ます。
しかし今回のブログでは、PullToRefreshの内容と同じ実装方法を、スクラッチで作る方法を紹介したいと思います。
上記のGithubのコードを読むと、「こんなに簡単にできるのかー」と驚いたので、その実装方法を紹介したいという意味でブログを書きました。
作り方は簡単で、以下の事を行うとプルリフレッシュを実現出来ます。
UIViewControllerの実装などで、以下のようなコードを記載します。
ユーザーがわざわざドラッグして表示してる場合には、Refreshが意図した通りに動くように、実装します。
ここでの処理は、RefreshViewの内容を変更することで、何を行うのかを示します。
ドラッグが終了した時点でのスクロール量に応じて、リフレッシュ処理を行います。
タップは、画面への触れ方によっては反応しないことがありますが、スワイプやドラッグなどの大きな動作は、比較的に操作ミスが少なくていいと感じています。
次のiPhoneアプリはデザイン/操作性/機能性ともに良いものを出したいと思います。
最後までご覧頂きまして、ありがとうございました。
今日は、Twitterクライアントとかで良くあるPull To Refreshを実装する方法をブログに記載したいと思います。

プルリフレッシュ(Pull to Refresh)とは
プルリフレッシュとは、TwitterクライアントやFacebookアプリなどで採用されているUIで、 TableViewのトップで、下にドラッグする事で、TableViewの内容を更新するUIです。例えば、以下のような画面が良く採用されています。

プルリフレッシュを簡単に実現する場合は、Githubで公開されているPullToRefreshを取り入れることで実現出来ます。
しかし今回のブログでは、PullToRefreshの内容と同じ実装方法を、スクラッチで作る方法を紹介したいと思います。
上記のGithubのコードを読むと、「こんなに簡単にできるのかー」と驚いたので、その実装方法を紹介したいという意味でブログを書きました。
プルリフレッシュを実装する方法
今回は、UITableViewを用いたアプリケーションで、プルリフレッシュを実現する方法です。作り方は簡単で、以下の事を行うとプルリフレッシュを実現出来ます。
- PullToRefresh用のラベルをUITableView上にaddSubViewする
- UIScrollViewDelegateを用いて、ドラッグ開始と終了のイベントを捉える
- UIScrollViewDelegateを用いて、スクロール位置を監視し、スロール量により処理を行う
- ドラッグが終了した際に、スクロール量に合わせてリフレッシュ処理を行う
PullToRefresy用のラベルをUITableView上にaddSubViewする
まずは、PullToRefresh用のラベルを作成して、UITableView上に配備します。UIViewControllerの実装などで、以下のようなコードを記載します。
// プルリフレッシュ用ラベルの高さ
#define REFRESH_VIEW_HEIGHT 100
- (void)viewDidLoad {
[super viewDidLoad];
// プルリフレッシュ用のViewを作成する。
// ポイントは、Rectのy座標を負数にしておくこと。
// そうすることで、上にドラッグした時のみに見えるようになる。
refreshView = [[UIView alloc] initWithFrame:CGRectMake(0, 0 - REFRESH_VIEW_HEIGHT, self.view.frame.size.width, REFRESH_VIEW_HEIGHT)];
// プルリフレッシュ用のViewを、tableViewのサブViewとして追加する。
refreshView.backgroundColor = [UIColor purpleColor];
[tableView addSubview:refreshView];
}
今回は、紫色のViewを追加しましたが、アプリ毎に追加で必要な情報があれば、refreshViewに追加することも可能です。UIScrollViewDelegateを用いて、ドラッグ開始と終了のイベントを捉える
続いて、UITableViewが継承しているUIScrollView用のDelegateを使い、ドラッグ開始/終了を捉えます。
- (void)viewDidLoad {
[superviewDidLoad];
// tableViewのdelegateは、UITableViewDelegateですが、
// UITableViewDelegateは、UIScrollViewDelegateを継承(実装)しているため、
// tableViewのdelegateに、UIScrollViewDeleageteを実装したselfを追加する事が可能です。
tableView.delegate = self;
}
// 以下ではUIScrollViewDelegateを実装していて、ドラッグ中か否かを、グローバル変数に保存します。
#pragma mark - UIScrollViewDelegate
- (void)scrollViewWillBeginDragging:(UIScrollView *)scrollView {
isDragging = YES;
return;
}
- (void)scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate {
isDragging = NO;
return;
}
ドラッグ中か否かの情報が必要な理由として、ユーザーがドラッグしてUITableViewの上に設置したRefreshViewを表示しているのか、
ただ勢い良くスクロースしたから惰性で表示されたのかを判断する必要があるからです。ユーザーがわざわざドラッグして表示してる場合には、Refreshが意図した通りに動くように、実装します。
UIScrollViewDelegateを用いて、スクロール位置を監視し、スロール量により処理を行う
スクロールを監視して、スクロール量により処理を行います。
#pragma mark - UIScrollViewDelegate
- (void)scrollViewDidScroll:(UIScrollView *)scrollView {
// ドラッグ中以外は、必要ないので処理しない。
if (!isDragging) return;
// 今回は、スクロール量により、RefreshViewの背景色を変更しています。
// 他にも、表示するテキストを変更するなど、UX向上のためのUI更新を行う。
float y = scrollView.contentOffset.y;
if (y < 0) {
if (y > (-REFRESH_VIEW_HEIGHT)) {
if (refreshView.backgroundColor != [UIColor purpleColor]) {
refreshView.backgroundColor = [UIColor purpleColor];
}
} else {
if (refreshView.backgroundColor != [UIColor redColor]) {
refreshView.backgroundColor = [UIColor redColor];
}
}
}
}
スクロール量により、どんな処理が行われるのか/行われないのかを、ユーザーへ示す必要があります。ここでの処理は、RefreshViewの内容を変更することで、何を行うのかを示します。
ドラッグが終了した際に、スクロール量に合わせてリフレッシュ処理を行う
最後に、本命のリフレッシュ処理を行います。ドラッグが終了した時点でのスクロール量に応じて、リフレッシュ処理を行います。
- (void)scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate {
isDragging = NO;
float y = scrollView.contentOffset.y;
// スクロール量に合わせて、処理を行う。
if (y < (-REFRESH_VIEW_HEIGHT)) {
[self refresh];
}
return;
}
今回は、RefreshViewが全て見えている状態でドラッグが終了した場合に、リフレッシュ処理を行うように実装しています。最後に
ドラッグやスワイプでコントロールアプリケーションってなんだか良いなぁと感じる今日この頃です。タップは、画面への触れ方によっては反応しないことがありますが、スワイプやドラッグなどの大きな動作は、比較的に操作ミスが少なくていいと感じています。
次のiPhoneアプリはデザイン/操作性/機能性ともに良いものを出したいと思います。
最後までご覧頂きまして、ありがとうございました。






