Я использую UIImagePickerController в UIPopoverController, который отлично работает с iOS6. С iOS 7 изображение "предварительного просмотра", которое показано для захвата изображения, поворачивается, но если я делаю снимок, он сохраняется правильно.
Вот как я получаю свой сборщик:
UIImagePickerController *imagePicker = [[UIImagePickerController alloc] init];
imagePicker.delegate = self;
imagePicker.sourceType = UIImagePickerControllerSourceTypeCamera;
imagePicker.mediaTypes = [NSArray arrayWithObjects:
(NSString *) kUTTypeImage,
nil];
imagePicker.allowsEditing = NO;
И добавьте его в контроллер popover:
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, чтобы отобразить popover в правильном положении:
presentPopoverFromRect:CGRectMake(aPosViewA.x, cameraButton_y, 100.0, 30.0)
Я не думаю, что проблема кроется там, поскольку я опробовал несколько комбинаций.
Я также попытался захватить изображение в полноэкранном режиме, но приложению разрешено использовать только ландшафтный режим. Если изображение выполняется в портретном режиме, а модальное представление отклонено, приложение также остается в портретном режиме. Я не мог найти способ не допустить перехода UIImagePickerController в портретный режим или принудительное возвращение приложения в ландшафтный режим, если модальное представление было отклонено.
ОБНОВЛЕНИЕ
Я принял ответ здесь и сделал еще один шаг.
Я преобразую представление после создания сборщика и перед показом popover:
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
Это было слишком противно, я нашел более чистое решение, которое решает мою проблему, но не является ответом на начальный вопрос относительно imagepicker в контроллере popover, который не рекомендуется Apple, но разрешен.
Теперь я подклассифицировал UIImagePickerController следующим образом:
@implementation QPImagePickerController
- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation {
return UIInterfaceOrientationIsLandscape(toInterfaceOrientation);
}
- (BOOL)shouldAutorotate {
return YES;
}
- (NSUInteger)supportedInterfaceOrientations{
return UIInterfaceOrientationMaskLandscape;
}
@end
и я использую imagepicker в полноэкранном режиме вместо этого в popover. Протестировано до сих пор в iOS7.