前置き
来週にはiOS9も来るというのに、いまさらながら気づいた問題があったので備忘録です。
間違った内容があったら、ご指摘してください。
iOS7まではStoryBoard上でUIImagePickerControllerを指定することが可能でした。
UIViewControllerを配置して、インスペクター上のCustom ClassでUIImagePickerControllerを指定することで簡単に遷移状態を表現することが可能でした。
UIImagePickerControllerはサブクラス作れないので、細かい設定は呼び出し元のprepareForSegueで指定する必要があったりはするんですが。
ところがiOS8からはUIImagePickerControllerはNSOperationQueue内でpresentViewController等コールする必要ができた。
しかし、通常のStoryBoardのsegueでは表示方法はStoryBoard任せになるので、NSOperationQueue内に記述することができない。
いろいろ検討してみる余地はあるんですが、一番コスト低いのは結局UIImagePickerControllerの呼び出しを無理にStoryBoardで表現せずにハードコーディングすることでした。
実装
- (void)doImagePickerController
{
UIImagePickerController* imagePicker = [[UIImagePickerController alloc] init];
imagePicker.sourceType = UIImagePickerControllerSourceTypePhotoLibrary;
imagePicker.allowsEditing = NO;
imagePicker.delegate = self;
[[NSOperationQueue mainQueue] addOperationWithBlock:^{
[self presentViewController:imagePicker animated:YES completion:nil];
}];
}
#pragma mark <UIImagePickerControllerDelegate>
- (void)imagePickerController:(UIImagePickerController *)picker
didFinishPickingMediaWithInfo:(NSDictionary *)info {
[self dismissViewControllerAnimated:YES completion:nil];
//TODO:
}
- (void)imagePickerControllerDidCancel:(UIImagePickerController *)picker{
[self dismissViewControllerAnimated:YES completion:nil];
}
検討
カスタムSegueを実装してみることも考えたんですが、ハードコーディングすれば上記のコード量で済むので、おそらくこれが最小コストだろうということで辞めました。