Приложение 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)