iOSの進捗表示にMBProgressHUDを使う

iOSにはUIProgressHUDという進捗表示用のインジケータ表示が有るのだけど、残念ながらこれは公式APIではないので、これを使ったアプリケーションはAppleに申請してもリジェクトされてしまう。

画面表示だけなので自分で似たような表示を作っても良いものの、今回は手っ取り早く仕上げるために、代替としてMBProgressHUDを使ってみた。ソースコードやサンプルプロジェクト、画面キャプチャが下記のgithubに載っている。(ライセンスはMIT)

MBProgressHUD is an iPhone drop-in class that displays a translucent HUD with a progress indicator and some optional labels while work is being done in a background thread. The HUD is meant as a replacement for the undocumented, private UIKit UIProgressHUD with some additional features.
MBProgressHUD is iOS4 and iPad compatible and released under the MIT license (see MBProgressHUD.h).

GitHub - jdg/MBProgressHUD: MBProgressHUD + Customizations

iOS4では、Blocksを使うとコードの見通しが良いだろう。

- (IBAction)showUsingBlocks:(id)sender {
  dispatch_async(dispatch_get_global_queue( DISPATCH_QUEUE_PRIORITY_LOW, 0), ^{
    // Show the HUD in the main tread 
    dispatch_async(dispatch_get_main_queue(), ^{
      // No need to hod onto (retain)
      MBProgressHUD *hud = [MBProgressHUD showHUDAddedTo:self.navigationController.view animated:YES];
        hud.labelText = @"Loading";
    });

    // Do a taks in the background
    [self myTask];

    // Hide the HUD in the main tread 
    dispatch_async(dispatch_get_main_queue(), ^{
      [MBProgressHUD hideHUDForView:self.navigationController.view animated:YES];
    });
  });
}

デモプロジェクトを動かしてみれば分かるように、プログレス表示時にはズーム付きのフェードイン・アウトの気の利いたアニメーションが効いている。表示形式の種類は豊富だし、簡単に使えるのでお勧めだ。