Как представить UIImagePickerController или открыть камеру в приложении только для ландшафта?
Я создаю приложение, которое работает только в ландшафтном режиме.
Во время регистрации я хочу открыть камеру или представить UIImagePickerController, но приложение рушится со следующей ошибкой:
*** Terminating app due to uncaught exception 'UIApplicationInvalidInterfaceOrientation', reason: 'Supported orientations has no common orientation with the application, and [PUUIAlbumListViewController shouldAutorotate] is returning YES'
Как я могу представить Image Picker или Camera in Landscape?
Ответы
Ответ 1
I found solution, case closed. i add in my appdelegate.m:
-(NSUInteger)application:(UIApplication *)application
supportedInterfaceOrientationsForWindow:(UIWindow *)window
{
if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPhone)
return UIInterfaceOrientationMaskAll;
else /* iPad */
return UIInterfaceOrientationMaskAllButUpsideDown;
}
Ответ 2
У меня была та же проблема в iOS 9, и ни одно из предложенных решений, которые я нашел (здесь или по аналогичным вопросам о SO), не работало для меня. Но я нашел решение с использованием UIPopoverPresentationController, который был представлен в iOS 8. Это то, что я делаю, в приложении, которое является портретом только на iPhone, и только для iPad на iPad. В моем делегате приложения у меня есть следующее:
func application(application: UIApplication,
supportedInterfaceOrientationsForWindow window: UIWindow?)
-> UIInterfaceOrientationMask {
if UIDevice.currentDevice().userInterfaceIdiom == .Pad {
return .Landscape
} else {
return .Portrait
}
}
Затем в диспетчере представлений, которому нужно отобразить сборщик фотографий:
@IBAction func choosePictureFromLibrary() {
let imagePickerController = UIImagePickerController()
imagePickerController.delegate = self
// Set the presentation style and grab the presentation controller,
// which is created for you.
imagePickerController.modalPresentationStyle = .Popover
let presentationController = imagePickerController.popoverPresentationController
// You must set a sourceView or barButtonItem so that it can
// draw a "bubble" with an arrow pointing at the right thing.
presentationController?.sourceView = photoButton
self.presentViewController(imagePickerController, animated: true) {}
}
Использование .Popover
modal presentation дает приятный, компактный (в основном iPhone-размер) вид, накладывающий экран на iPad. Когда вы бежите на iPhone, он просто запускается полноэкранным, как обычный модальный вид.
Ответ 3
Решение Swift 3, работающее как для iPhone, так и для iPad
func openGallary(_ sender:UIButton)
{
imagepicker?.delegate = self
imagepicker?.allowsEditing = false
imagepicker!.sourceType = UIImagePickerControllerSourceType.photoLibrary
if UIDevice.current.userInterfaceIdiom == .phone
{
self.present(imagepicker!, animated: true, completion: nil)
}
else
{
imagepicker?.modalPresentationStyle = .popover
let presentationController = imagepicker?.popoverPresentationController
// You must set a sourceView or barButtonItem so that it can
// draw a "bubble" with an arrow pointing at the right thing.
presentationController?.sourceView = sender
self.present(imagepicker!, animated: true) {}
}
}
Ответ 4
shouldAutorotate
метод shouldAutorotate
:
- (BOOL)shouldAutorotate {
UIInterfaceOrientation interfaceOrientation = [[UIApplication sharedApplication] statusBarOrientation];
if (UIDeviceOrientationIsLandscape(interfaceOrientation)) {
return YES;
}
return NO;
}
Добавьте этот код в PUUIAlbumListViewController
и все остальные контроллеры представлений. Убедитесь, что вы отметили только ландшафт (пейзаж слева и справа) в своей цели.