2012年10月15日月曜日

iOS6から追加されたUIRefreshControlを試す

iOS6から追加されたUIRefreshControlを試してみたのでそのメモ。

このクラスは、もう最近はおなじみになった、ビューを下にグイッと引っ張り離すとビューが更新されるアレです。「プルダウンリフレッシュ」なんて呼ばれたりしています。

公式のリファレンスは以下になります。

UIRefreshControl Class Reference - Apple Developer

サンプルコード

とりあえず動くサンプルです。

このUIRefreshControlはUIScrollViewにUIRefreshControlのインスタンスを持たせることで機能します。スクロールビューを持っていればいいのでUITableViewでもUIWebViewでも実装できます。

ViewController.h

#import <UIKit/UIKit.h>

@interface ViewController : UIViewController
{
    UIRefreshControl *_refreshControl;
}

ViewController.m

- (void)viewDidLoad
{
    [super viewDidLoad];

    [self createRefreshControl];
}

-(void)createRefreshControl
{
    /*UIScrollViewの生成*/
    UIScrollView *scrollView = [[[UIScrollView alloc] initWithFrame:self.view.bounds] autorelease];
    scrollView.backgroundColor = [UIColor darkGrayColor];
    scrollView.contentOffset = CGPointMake(0, 0);
    //scrollView.bounces = YES; 
    //bouncesを無効にするとUIRefreshControlが動かないので、YESを返すか、設定はしないでおく
    
    /*ターゲットとなるUIViewの生成*/
    UIView *targetView = [[[UIView alloc]initWithFrame:CGRectMake(0, 0, self.view.frame.size.width, self.view.frame.size.height * 2)] autorelease];
    targetView.backgroundColor = [UIColor greenColor];

    [scrollView addSubview:targetView];  //スクロールビューにターゲットビューを追加
    scrollView.contentSize = targetView.bounds.size;  //スクロールする画面サイズを指定
    
    [self.view addSubview:scrollView];  //初期ビューにスクロールビューを追加
    
    /*UIRefreshControlの生成と実装*/
    _refreshControl = [[[UIRefreshControl alloc]init] autorelease];
    [_refreshControl addTarget:self action:@selector(refreshStart) forControlEvents:UIControlEventValueChanged];
    [scrollView addSubview:_refreshControl];
    
    //タイトルの設定
    NSMutableDictionary *attributes = [NSMutableDictionary dictionary];
    [attributes setObject:[UIColor whiteColor] forKey:NSBackgroundColorAttributeName];  //タイトルの背景色
    [attributes setObject:[UIColor redColor] forKey:NSForegroundColorAttributeName];  //タイトルの文字色
    
    NSAttributedString *title = [[[NSAttributedString alloc] initWithString:@"Refresh!!" attributes:attributes] autorelease];
    _refreshControl.attributedTitle = title;  //タイトルの挿入
    
    _refreshControl.tintColor = [UIColor orangeColor];  //色の設定
}

-(void)refreshStart
{
    NSLog(@"Refresh start!!");
    
    /*このメソッドでくるくる開始*/
    [_refreshControl beginRefreshing];   //インスタンスメソッド
    
    [self performSelector:@selector(refreshFinished) withObject:nil afterDelay:5.0f];
}

-(void)refreshFinished
{
    NSLog(@"Refresh finish!!");

    /*このメソッドでくるくる停止*/
    [_refreshControl endRefreshing];  //インスタンスメソッド
}

更新処理を開始したときはbeginRefreshingメソッド、終了したときはendRefreshingメソッドを呼んであげます。今回endRefreshingメソッドを呼ぶ際はとりあえず遅延実行により5秒のウェイトを持たせて実行しています。

コメントにも書いていますが、UIScrollViewのbouncesプロパティを無効にした場合はUIRefreshControlは機能しないようなのでそこは注意です。

デモ



おわり

Xcode4.3で実行しようとしたのですがエラーが出て実行できませんでした。前のバージョンでプルダウンリフレッシュを実装する場合はサードパーティで提供されているライブラリなんかを使わなければいけないようですね。

参考記事

iOS6で追加されたUIRefreshControlの使い方 - a.out
Introduction to In-App Purchases in iOS 6 Tutorial - RAYWENDERLICH
iPhoneアプリ開発、その(118) UIScrollViewはどうやって使うのか? - テン*シー*シー

関連記事

iOS 6 UIRefreshControl with MonoTouch - ConceptDev (Craig Dunn's blog)
enormego / EGOTableViewPullRefresh - GitHub
Pull-to-Refresh TableView for iOS - Cocoa Controls

0 件のコメント:

コメントを投稿