UIImagePickerController в альбомной ориентации
-
21-09-2019 - |
Вопрос
Я искал ответ на этот вопрос, но ничего не мог придумать.По-видимому, iPhone SDK 3.0 сделал возможным отображение UIImagePickerController в альбомном режиме, но я не нахожу никакого метода, который позволил бы это.Я бы подумал, что если приложение по умолчанию находится в альбомной ориентации, оно автоматически настроит контроллер изображения, но у меня это не работает.
Спасибо за любую помощь!
Решение
Я не проверял, является ли это незаконным, но у меня это сработало.Если вы хотите, чтобы UIImagePickerController запускался (и оставался) в коде альбомной ориентации:
//Initialize picker
UIImagePickerController * picker = [[UIImagePickerController alloc] init];
picker.delegate = self;
//set Device to Landscape. This will give you a warning. I ignored it.
//warning: 'UIDevice' may not respond to '-setOrientation:'
[[UIDevice currentDevice] setOrientation:UIInterfaceOrientationLandscapeRight];
//Set Notifications so that when user rotates phone, the orientation is reset to landscape.
[[UIDevice currentDevice] beginGeneratingDeviceOrientationNotifications];
//Refer to the method didRotate:
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(didRotate:)
name:@"UIDeviceOrientationDidChangeNotification" object:nil];
//Set the picker source as the camera
picker.sourceType = UIImagePickerControllerSourceTypeCamera;
//Bring in the picker view
[self presentModalViewController:picker animated:YES];
Метод не претерпел изменений:
- (void) didRotate:(NSNotification *)notification
{
//Maintain the camera in Landscape orientation
[[UIDevice currentDevice] setOrientation:UIInterfaceOrientationLandscapeRight];
}
Другие советы
Нет необходимости создавать подкласс;просто переопределите modalPresentationStyle
собственность.
UIImagePickerController *picker = [[UIImagePickerController alloc] init];
picker.modalPresentationStyle = UIModalPresentationFormSheet;
[viewController presentViewController:picker animated:YES completion:NULL];
Если вам просто нужно избавиться от предупреждения, попробуйте
@interface UIDevice ()
-(void)setOrientation:(UIDeviceOrientation)orientation;
@end
Я разработал класс UIImagePicker в ландшафтном режиме.Отлично подходит для приложений, которые я разработал:надеюсь, у вас это тоже сработает:
ГитХаб: https://github.com/imaginaryunit/iOSLandscapeThreadedImagePicker.git
У меня также есть полностью ландшафтное приложение, использующее UIImagePickerController.Пожалуйста, обратите внимание, что если вы вызываете UIImagePickerController в ландшафтном режиме, ваше приложение может быть отклонено группой проверки Apple.
Я разработал простой способ решения этой проблемы, который использует делегат shouldAutorotate.Apple одобряет этот метод для полностью ландшафтного приложения.
Видишь здесь для получения подробной информации и загрузки полного исходного кода проекта.
Создайте категорию из Контроллер UINavigationController и добавьте этот метод
- (BOOL)shouldAutorotate
{
return NO;
}
Подкласс UIImagePickerController
и переопределить modalPresentationStyle
следующим образом:
- (UIModalPresentationStyle)modalPresentationStyle
{
if([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPad)
{
return UIModalPresentationFormSheet;
}
return [super modalPresentationStyle];
}
Средство выбора изображений теперь представляет собой лист формы и больше не находится в полноэкранном режиме, но оно хорошо смотрится в альбомном режиме.Это должно быть полностью безопасно для App Store.
Это работает для галереи, а не для фотосъемки.
Я решил эту проблему следующим образом:после каждого изменения ориентации я просто заново создаю средство выбора.Попробуй это.По-другому слишком криво...
Я разрабатываю класс, который изо всех сил старается работать в ландшафтном режиме.Проверьте это на GitHub: Контроллер RACameraController