※本記事は、旧ブログからの再掲です。
iPhoneアプリからネットワーク通信を行うときなど時間がかかる処理を行う場合には、処理中であることをユーザへ知らせるためにActivity Indicatorを表示します。
以前、「同期通信・非同期通信」という記事を書いたのですが、そのような処理を行う際に使用します。
インジケーターの種類は以下の3つがあり、初期化時にinitWithActivityIndicatorStyle:メソッドを使用するか、初期化後にactivityIndicatorViewStyleプロパティで変更することもできます。
・UIActivityIndicatorViewStyleWhiteLarge (大きな白いインジケーター)
・UIActivityIndicatorViewStyleWhite (白いインジケーター)
・UIActivityIndicatorViewStyleGray (グレーのインジケーター)
Activity Indicatorを表示するには、UIActivityIndicatorViewインスタンスを作成し、アニメーションを開始させます。
アニメーションの開始には、startAnimatingメソッドを使用し、逆にアニメーションの停止には、stopAnimatingメソッドを使用します。
ただ、アニメーションの開始・停止を実行しても表示されない場合があります。
一旦、メインループに戻らないとアニメーションが機能しないので、アニメーションを開始させた後にperformSelector:withObject:afterDelay:メソッドを使用しています。
以下の例では、networkActivityIndicatorVisibleプロパティにYES/NOを設定していますが、この設定を行うとステータスバーにインジケーターを表示/非表示することができます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 |
// インジケーター表示 [self showActivityIndicator]; // サーバーにリクエスト送信 [self performSelector:@selector(sendRequestToServer) withObject:nil afterDelay:0.1]; : (略) : /* * サーバーへリクエスト送信&結果受信処理 */ - (void)sendRequestToServer { // サーバーにリクエストを送信 NSURL *url = [NSURL URLWithString:@"http://localhost/login.php"]; NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url]; NSString *post = [NSString stringWithFormat:@"login_id=%@&password=%@", login_id, password]; NSData *postData = [post dataUsingEncoding:NSUTF8StringEncoding]; NSURLResponse *response = nil; NSError *error = nil; [request setHTTPMethod:@"POST"]; [request setValue:@"application/x-www-form-urlencoded" forHTTPHeaderField:@"content-type"]; [request setHTTPBody:postData]; NSData *data = [NSURLConnection sendSynchronousRequest:request returningResponse:&response error:&error]; // インジケーター非表示 [self hideActivityIndicator]; // error if ( error ) { NSLog(@"Connection failed. Error - %@ %d %@", [error domain], [error code], [error localizedDescription]); return; } // response NSLog(@"response:%@", response); NSHTTPURLResponse *httpResponse = (NSHTTPURLResponse *)response; NSLog(@"expectedContentLength:%lld", [httpResponse expectedContentLength]); NSLog(@"MIMTType:%@", [httpResponse MIMEType]); NSLog(@"suggestedFieldname:%@", [httpResponse suggestedFilename]); NSLog(@"textEncodingName:%@", [httpResponse textEncodingName]); NSLog(@"URL:%@", [httpResponse URL]); NSLog(@"statusCode:%d", [httpResponse statusCode]); NSLog(@"localizedStringForStatusCode:%@", [NSHTTPURLResponse localizedStringForStatusCode:[httpResponse statusCode]]); if ( [httpResponse statusCode] != 200 ) { NSLog(@"statusCode:%d (%@)", [httpResponse statusCode], [NSHTTPURLResponse localizedStringForStatusCode:[httpResponse statusCode]]); return; } // data nil if ( ! data ) { NSLog(@"data:nil"); return; } // 処理結果データ解析 : (略) : return; } /* * インジケーター表示 */ - (void)showActivityIndicator { // Activity Indicator 表示 _loadingView = [[UIView alloc] initWithFrame:self.navigationController.view.bounds]; _loadingView.backgroundColor = [UIColor blackColor]; _loadingView.alpha = 0.5f; _indicator = [[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleWhiteLarge]; [_indicator setCenter:CGPointMake(_loadingView.bounds.size.width/2, _loadingView.bounds.size.height/2)]; [_loadingView addSubview:_indicator]; [self.navigationController.view addSubview:_loadingView]; [_indicator startAnimating]; [UIApplication sharedApplication].networkActivityIndicatorVisible = YES; } /* * インジケーター非表示 */ - (void)hideActivityIndicator { // Activity Indicator 非表示 [_indicator stopAnimating]; [_loadingView removeFromSuperview]; _indicator = nil; _loadingView = nil; [UIApplication sharedApplication].networkActivityIndicatorVisible = NO; } |
<おすすめの書籍>
私がUIKitを使用する時に一番お世話になった本です。とても分かりやすいので初心者の方にもオススメです。