[iOS] 半透明の画面の上にUIActivityIndicatorViewを追加する

[iOS] 半透明の画面の上にUIActivityIndicatorViewを追加する

APIやファイルとかの非同期通信をしているときに必要な、読み込み中のビューを追加してみました。

UIActivityIndicatorView を使う

iOSで、半透明の画面を親画面の上に被せて読み込み中のインジケータをアニメーションさせるには、半透明の UIView を作成して UIActivityIndicatorView をその上に乗せるらしい。

このとき、navigationController に追加しないとナビゲーションバーの下にきてしまう。

// ローディングビュー作成
UIView *loadingView = [[UIView alloc] initWithFrame:self.navigationController.view.bounds];
loadingView.backgroundColor = [UIColor blackColor];
loadingView.alpha = 0.5f;

// インジケータ作成
UIActivityIndicatorView *indicator = [[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleWhiteLarge];
indicator.activityIndicatorViewStyle = UIActivityIndicatorViewStyleWhite;
[indicator setCenter:CGPointMake(_loadingView.bounds.size.width / 2, loadingView.bounds.size.height / 2)];

// ビューに追加
[loadingView addSubview:indicator];
[self.navigationController.view addSubview:loadingView];

// インジケータ再生
[indicator startAnimating];

インジケータ再生中

キーボードを扱うときの対処法

上記の場合、親画面にキーボードを出してるとその裏に回り込んでしまうという問題があります。

また、読み込み中にテキストの操作も受け付けたくないので、UITextViewuserInteractionEnabled = NO に設定すると今度はキーボードが自動的に下に隠れてしまう。

似たような状態を探そうと思って、Twitter関連のアプリで、つぶやきを投稿するときの画面で [送信] ボタンをタップした後の挙動を比べてみました。

Twitter for iPhone 最初に編集画面が閉じられてから、リスト画面上で送信開始。
Echofon そのまま半透明のフィルターが全体にかかり送信開始。送信完了後、アクセス成功したら閉じる。エラーの場合アラートが出る。そのとき、なぜかキーボードが一度下がる。
TweetDeck 最初に編集画面が閉じてから、リスト画面上で送信開始。送信中は下の方にアクセス状況が表示されている。
Weet キーボードが閉じて送信開始。送信中のインジケータの画面は半透明ではない。送信完了後、アクセス成功したら閉じる。エラーの場合アラートが出てキーボードが表示される。
Icebird 最初に編集画面が閉じてから、リスト画面上で送信開始。
Twitbird 最初に編集画面が閉じてから、リスト画面上で送信開始。

代表的なアプリだけだが、一通りみたところ最初に編集画面を閉じてから処理させる方法が多かった。
でもまぁ、とりあえず一番安定してそうな Weet に倣ってみようかと思う。