iOS6 で完全に動作する UIPopoverController 内で UIImagePickerController を使用しています。iOS 7 では、画像をキャプチャするために表示される「プレビュー」画像が回転しますが、写真を撮ると正しく保存されます。
これが私のピッカーを取得する方法です:
UIImagePickerController *imagePicker = [[UIImagePickerController alloc] init];
imagePicker.delegate = self;
imagePicker.sourceType = UIImagePickerControllerSourceTypeCamera;
imagePicker.mediaTypes = [NSArray arrayWithObjects:
(NSString *) kUTTypeImage,
nil];
imagePicker.allowsEditing = NO;
そして、それをポップオーバー コントローラーに追加します。
self.imagePickerPopOver = [[UIPopoverController alloc] initWithContentViewController:imagePicker];
[self.imagePickerPopOver presentPopoverFromRect:CGRectMake(aPosViewA.x, cameraButton_y, 100.0, 30.0) inView:self.detailViewController.view permittedArrowDirections:UIPopoverArrowDirectionAny animated:YES];
これらは、正しい位置にポップオーバーを表示するための UIScrollView でのボタン位置の計算です。
presentPopoverFromRect:CGRectMake(aPosViewA.x, cameraButton_y, 100.0, 30.0)
いくつかの組み合わせを試したので、そこに問題があるとは思いません。
フルスクリーン モードでも画像をキャプチャしようとしましたが、アプリは横向きモードしか使用できません。画像が縦向きモードで撮影され、モーダル ビューが閉じられた場合、アプリも縦向きモードのままになります。UIImagePickerController がポートレート モードに切り替わらないようにする方法や、モーダル ビューが閉じられた場合にアプリを強制的にランドスケープ モードに戻す方法が見つかりませんでした。
アップデート
私はここから答えを得て、さらに一歩前進しました。
ピッカーを作成した後、ポップオーバーを表示する前にビューを変換します。
switch ([UIApplication sharedApplication].statusBarOrientation) {
case UIInterfaceOrientationLandscapeLeft:
self.imagePicker.view.transform = CGAffineTransformMakeRotation(M_PI/2);
break;
case UIInterfaceOrientationLandscapeRight:
self.imagePicker.view.transform = CGAffineTransformMakeRotation(-M_PI/2);
break;
default:
break;
}
iPadの向きを変えない限り、これは機能します。そのために、オリエンテーション変更イベントに登録しています。
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(orientationChanged:) name:UIDeviceOrientationDidChangeNotification object:nil];
ピッカー ビューを変更します。
- (void)orientationChanged:(NSNotification *)notification{
if (self.imagePicker) {
switch ([UIApplication sharedApplication].statusBarOrientation) {
case UIInterfaceOrientationLandscapeLeft:
self.imagePicker.view.transform = CGAffineTransformMakeRotation(M_PI/2);
break;
case UIInterfaceOrientationLandscapeRight:
self.imagePicker.view.transform = CGAffineTransformMakeRotation(-M_PI/2);
break;
default:
break;
}
}
}
残りの問題:最初に書いたように、写真を撮ったときに、それを受け入れるか却下するかが正しく表示されました。これも変形するようになりました。どういうわけか、画像がいつ撮影されたかを知り、元に戻す必要があります。
そして、これは本当に厄介なハックであり、おそらく次の iOS アップデートでは機能しません。それをよりクリーンな方法で実装する方法を知っている人はいますか?
更新 2
これは厄介すぎました。問題を解決するよりクリーンなソリューションを見つけましたが、ポップオーバー コントローラーのイメージピッカーに関する最初の質問に対する回答ではありません。これは Apple では推奨されていませんが、許可されています。
UIImagePickerController を次のようにサブクラス化しました。
@implementation QPImagePickerController
- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation {
return UIInterfaceOrientationIsLandscape(toInterfaceOrientation);
}
- (BOOL)shouldAutorotate {
return YES;
}
- (NSUInteger)supportedInterfaceOrientations{
return UIInterfaceOrientationMaskLandscape;
}
@end
ポップオーバーではなくフルスクリーンでイメージピッカーを使用しています。これまでのところ iOS7 でテスト済みです。