Приложение iOS7 iPad для iPad, использующее UIImagePickerController
Я считаю, что это распространенная проблема, и многие ответы больше не работают, многие просто частично, если вы находитесь под iOS7, а ваше приложение для iPad - только для ландшафтов, но вы хотите использовать UIImagePickerController
с исходным текстом UIImagePickerControllerSourceTypePhotoLibrary
или UIImagePickerControllerSourceTypeCamera
.
Как правильно настроить его, так что он работает на 100%? И вы не получаете смешанных ориентаций и избегаете ошибки "Поддерживаемые ориентации не имеют общей ориентации с приложением, а shouldAutorotate
возвращает YES
".
Ответы
Ответ 1
Если ваше приложение iPad является ландшафтом только во всех условиях, выполните следующие 3 действия:
1) В делетете приложения
- (NSUInteger)application:(UIApplication *)application supportedInterfaceOrientationsForWindow:(UIWindow *)window {
return UIInterfaceOrientationMaskAll;
}
2) Создайте заголовок категории
#import "UIViewController+OrientationFix.h"
@implementation UIViewController (OrientationFix)
- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation {
return UIInterfaceOrientationIsLandscape(toInterfaceOrientation);
}
- (BOOL)shouldAutorotate {
return YES;
}
- (NSUInteger)supportedInterfaceOrientations {
return UIInterfaceOrientationMaskLandscape;
}
@end
3) Создайте реализацию категории
#import "UIImagePickerController+OrientationFix.h"
@implementation UIImagePickerController (OrientationFix)
- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation {
return UIInterfaceOrientationIsLandscape(toInterfaceOrientation);
}
- (BOOL)shouldAutorotate {
return YES;
}
- (NSUInteger)supportedInterfaceOrientations {
return UIInterfaceOrientationMaskLandscape;
}
@end
Примечание. Вам не нужно импортировать эти категории в любом месте, достаточно, чтобы они были скомпилированы с проектом
Примечание: нет необходимости реализовывать эти методы в любом VC
Примечание: нет необходимости менять ориентацию, поддерживаемую plist.
Это проверено и работает при любых условиях
Ответ 2
Я видел этот код из Apple Sample Code.
UIImagePickerController *imagePickerController = [[UIImagePickerController alloc] init];
imagePickerController.modalPresentationStyle = UIModalPresentationCurrentContext;
Благодаря этому UIModalPresentationCurrentContext UIImagePickerController
будет открыт в соответствии с текущей ориентацией устройства.
Ответ 3
В документации Apple говорится:
"Важно: класс UIImagePickerController поддерживает только портретный режим.
Хотя, он отлично работает в ландшафте для полного экрана и на iOS 6.
Ссылка на класс UIImagePickerController
Ответ 4
Благодаря предложению Питера Лапишу выше. Это не работает для меня (возможно, я на iOS 8.3), но я смог изменить его, чтобы устранить мои проблемы с ориентацией. Мои коды ниже
В делегате приложения
- (NSUInteger)application:(UIApplication *)application supportedInterfaceOrientationsForWindow:(UIWindow *)window
{
return UIInterfaceOrientationMaskAll;
}
Категория UIImagePickerController
@implement UIImagePickerController (extensions)
- (BOOL)shouldAutorotate {
return YES;
}
- (NSUInteger)supportedInterfaceOrientations {
return UIInterfaceOrientationMaskAll;
}
- (UIInterfaceOrientation)preferredInterfaceOrientationForPresentation {
return [[UIApplication sharedApplication] statusBarOrientation];
}
@end
Категория UIViewController
@implementation UIViewController (extensions)
- (BOOL)shouldAutorotate {
return YES;
}
- (NSUInteger)supportedInterfaceOrientations {
return UIInterfaceOrientationMaskAll;
}
@end
Ответ 5
Хотя большинство ответов рекомендуют использовать .currentContext
, я обнаружил после отклонения imagepicker, все было не так.
На благоустроенном iPad, имхо, лучше всего использовать .formSheet
:
let picker = UIImagePickerController()
picker.modalPresentationStyle = .formSheet
picker.sourceType = .photoLibrary
picker.delegate = self
self.present(picker, animated: true)