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];
キーボードを扱うときの対処法
上記の場合、親画面にキーボードを出してるとその裏に回り込んでしまうという問題があります。
また、読み込み中にテキストの操作も受け付けたくないので、UITextView
を userInteractionEnabled = NO
に設定すると今度はキーボードが自動的に下に隠れてしまう。
似たような状態を探そうと思って、Twitter関連のアプリで、つぶやきを投稿するときの画面で [送信] ボタンをタップした後の挙動を比べてみました。
最初に編集画面が閉じられてから、リスト画面上で送信開始。 | |
そのまま半透明のフィルターが全体にかかり送信開始。送信完了後、アクセス成功したら閉じる。エラーの場合アラートが出る。そのとき、なぜかキーボードが一度下がる。 | |
最初に編集画面が閉じてから、リスト画面上で送信開始。送信中は下の方にアクセス状況が表示されている。 | |
キーボードが閉じて送信開始。送信中のインジケータの画面は半透明ではない。送信完了後、アクセス成功したら閉じる。エラーの場合アラートが出てキーボードが表示される。 | |
最初に編集画面が閉じてから、リスト画面上で送信開始。 | |
最初に編集画面が閉じてから、リスト画面上で送信開始。 |
代表的なアプリだけだが、一通りみたところ最初に編集画面を閉じてから処理させる方法が多かった。
でもまぁ、とりあえず一番安定してそうな Weet に倣ってみようかと思う。