SourceType がPhotoLibrary だとツールバーが消えてしまう
先日、こんなエントリーを書きました。
UIImagePickerController をツールバーのダブルタップで引っ込める方法を紹介しています。
UIImagePickerController をツールバーのダブルタップで引っ込める | 極上の人生
ところが、このUIImagePickerController のSourceType がPhotoLibrary の場合、せっかく表示したツールバーがすぐに消えてしまうという困った現象に遭遇しました。
今回は、この現象の回避Tipsです。
setToolbarHidden:NO をpresentViewController: のcompletion: ブロック内に記述するだけ
方法は至極簡単。
ツールバーを表示するための1行を、UIImagePickerController のpresentViewController: メソッドのcompletion: ブロック内に記述するだけです。
これだと消えちゃう
- (void)showPhotoLibrary { // デバイスでPhotoLibrary を使えるか確認 if ( ![UIImagePickerController isSourceTypeAvailable:UIImagePickerControllerSourceTypePhotoLibrary] ) { return; } // UIImagePickerController をPhotoLibrary タイプで用意 UIImagePickerController* ipc = [[UIImagePickerController alloc] init]; [ipc setSourceType:UIImagePickerControllerSourceTypePhotoLibrary]; [ipc setDelegate:self]; // ツールバー表示 [ipc setToolbarHidden:NO]; // UIImagePickerController(PhotoLibrary)を表示 [self presentViewController:ipc animated:YES completion:nil]; }
これなら消えない
- (void)showPhotoLibrary { // デバイスでPhotoLibrary を使えるか確認 if ( ![UIImagePickerController isSourceTypeAvailable:UIImagePickerControllerSourceTypePhotoLibrary] ) { return; } // UIImagePickerController をPhotoLibrary タイプで用意 UIImagePickerController* ipc = [[UIImagePickerController alloc] init]; [ipc setSourceType:UIImagePickerControllerSourceTypePhotoLibrary]; [ipc setDelegate:self]; // UIImagePickerController(PhotoLibrary)を表示 [self presentViewController:ipc animated:YES completion:^{ // 表示成功後の処理(completion:)で、ツールバー表示 [ipc setToolbarHidden:NO]; }]; }
消えちゃう方のコードだと、UIImagePickerController の表示直後はツールバーが見えます。
しかし、すぐに画面下に押し出されるように、ニョロっと消えてしまうのです。
これはおそらく、ツールバーの描画タイミングより後にそれを打ち消す様な描画処理が呼ばれているからでしょう。
ですので、UIImagePickerController の表示完了後に呼び出されるcompletion: ブロック内にツールバーの表示設定を書くようにしたところ、上手く行ったというわけです。
やっぱり消えちゃうUIToolbar
2013.02.19 追記
その後、PhotoLibrary でも問題なく表示される様になったと喜んだのもつかの間。
PhotoLibrary 画面からカメラロール等のサブ・ライブラリを選んだ後、再度PhotoLibrary のルート画面に戻ると、せっかく表示させたはずのUIToolbar が消えちゃう現象を確認。
結論としては、setToolbarHidden:YES を使わずに、addSubview: を使ってUIToolbar を表示させることで、上記の操作を行なってもUIToolbar が消えない様になりました。
以下、コード。
今度こそ消えない(たぶん…)
- (void)showPhotoLibrary { // デバイスでPhotoLibrary を使えるか確認 if ( ![UIImagePickerController isSourceTypeAvailable:UIImagePickerControllerSourceTypePhotoLibrary] ) { return; } // UIImagePickerController をPhotoLibrary タイプで用意 UIImagePickerController* ipc = [[UIImagePickerController alloc] init]; [ipc setSourceType:UIImagePickerControllerSourceTypePhotoLibrary]; [ipc setDelegate:self]; UIToolbar* tb = [[UIToolbar alloc] init]; float tbh = 44.0f; float tbw = [[ipc view] frame].size.width; float tby = [[ipc view] frame].size.height - tbh; [tb setFrame:CGRectMake(0, tby, tbw, tbh)]; // UIImagePickerController(PhotoLibrary)を表示 [self presentViewController:ipc animated:YES completion:^{ // 表示成功後の処理(completion:)で、ツールバー表示 [[ipc view] addSubview:tb]; }]; }