31

Я считаю, что это распространенная проблема, и многие ответы больше не работают, многие просто частично, если вы находитесь под iOS7, а ваше iPad-приложение - только для пейзажа, но вы хотите использовать UIImagePickerController с источником UIImagePickerControllerSourceTypePhotoLibrary или UIImagePickerControllerSourceTypeCamera.iOS7 iPad Только для iPad приложение, использующее UIImagePickerController

Как правильно установить его, так что он работает на 100%? И вы не получаете смешанных ориентаций и избегаете ошибки «Поддерживаемые ориентации не имеют общей ориентации с приложением, а shouldAutorotate возвращает YES».

ответ

81

Если ваш 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 поддерживаются ориентации

Это проверено и работает в любых условиях

+0

Что если приложение не только пейзаж? – Collin

+0

, так как это не должно быть проблемой, так как приложение поддерживает любую ориентацию в любом случае –

+12

Вы не должны переопределять методы класса в категории. Какой метод фактически используется, технически не определен, даже если он всегда работает. Apple может изменить что-то, что сломает его в будущем. – Gavin

1

В документации Apple говорится:

«Важно: класс UIImagePickerController поддерживает только портретный режим».

Хотя, он отлично работает в альбомном на весь экран и прошивку 6.

UIImagePickerController class reference

41

Я видел этот код с примерами кода Apple.

UIImagePickerController *imagePickerController = [[UIImagePickerController alloc] init]; 
imagePickerController.modalPresentationStyle = UIModalPresentationCurrentContext; 

В связи с этим UIModalPresentationCurrentContextUIImagePickerController будет открыт в соответствии с текущей ориентацией устройства.

+1

Так просто, но отлично работает. –

+3

Это лучший ответ. Использование категорий - это взлом. Это работает с типом источника фото, видео и библиотеки. Протестировано с iOS8.3. – liefersfl

+1

Этот ответ более красив, чем любой, что я видел. – Ryan

0

Благодаря предложению Питера Лапишу выше. Это не работает для меня (возможно, я на 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 
0

Хотя большинство ответов рекомендуют использовать .currentContext, я обнаружил после отклонения запроса imagepicker, все было не так ,

На Благоустроенный IPAD, IMHO это лучше, если вы будете использовать .formSheet:

let picker = UIImagePickerController() 
picker.modalPresentationStyle = .formSheet 
picker.sourceType = .photoLibrary 
picker.delegate = self 
self.present(picker, animated: true) 
Смежные вопросы