19

Я создаю приложение, которое находится в ландшафтном режиме, и я использую UIImagePickerController для съемки фотографий с помощью камеры iPhone в нем, и я также хочу создать его в ландшафтном режиме.Использование UIImagePickerController в альбомной ориентации

Но, как предполагает документация Apple, UIImagePickerController не поддерживает ландшафтную ориентацию, и что мне нужно сделать, чтобы получить желаемую функциональность?

+0

Кажется, что работает в iOS 8 beta 4. Единственная проблема заключается в том, что после съемки на фото он покажет вам экран (используйте эту фотографию или отмените) в портретном режиме. Но изображение захвачено в пейзаже. –

ответ

44

Если вы хотите использовать UIImagePickerController в ландшафтном режиме, используйте user1673099's answer, но вместо того, чтобы:

- (BOOL)shouldAutorotate 
{ 
    return NO; 
} 

использование:

- (UIInterfaceOrientationMask)supportedInterfaceOrientations{ 
    return UIInterfaceOrientationMaskLandscape; 
} 

, а затем выбора откроется в альбомном режиме:

enter image description here

Но сделайте s Юр вы проверяете Портрет в информации развертывания:

enter image description here

+0

Он отлично работает. Один вопрос, почему мы должны проверять портрет в информации о развертывании? Я знаю, что это необходимо, но я не могу понять причину. –

+2

@AnsonYao, потому что 'UIImagePickerController' поддерживает только портретный режим. Если вы не поддерживаете портрет «глобально», сборщик изображений будет разбиваться, поскольку он не имеет удобной ориентации. – pkamb

+0

@ Mc.Lover его работа, если я проверяю портретный режим в информации о развертывании. но это просто меняет ориентацию моего приложения.Не могли бы вы сказать мне, как я могу решить этот вопрос –

11

Попробуйте этот путь ....

Согласно Apple, документ, ImagePicker контроллер никогда не Поворот в ландшафтном режиме. Вы должны использовать только в портретном режиме.

Для отключения режима ландшафтного только для ImagePicker контроллер следует ниже код:

В вашем ViewController.m:

сделать SubClass (NonRotatingUIImagePickerController) из изображения Выбора контроллера

@interface NonRotatingUIImagePickerController : UIImagePickerController 

@end 

@implementation NonRotatingUIImagePickerController 
// Disable Landscape mode. 
- (BOOL)shouldAutorotate 
{ 
    return NO; 
} 
@end 

Использования как указано ниже

UIImagePickerController* picker = [[NonRotatingUIImagePickerController alloc] init]; 
     picker.sourceType = UIImagePickerControllerSourceTypePhotoLibrary; 
     picker.delegate = self; 
    etc.... Just as Default ImagePicker Controller 

Это работает для меня & Дайте мне знать, если у вас есть какие-либо проблемы.

+0

Это полезно для вас ?? – user1673099

+0

Я не хочу отключать ландшафтный режим, я хочу использовать контроллер выбора изображений в ландшафтном режиме, а не в режиме портрета. Я хочу знать, могу ли я поворачивать подборщик изображений для съемки, или нет? –

+0

@ParasGorasiya, ImagePicker никогда не будет поддерживать ландшафтный режим. Он поддерживает только портретный режим. – user1673099

5

Правильный способ использования UIImagePickerController в ландшафтном режиме без каких-либо хаков, чтобы поместить его в UIPopoverController

- (void)showPicker:(id)sender 
{ 
    UIButton *button = (UIButton *)sender; 
    UIImagePickerController *picker = [[UIImagePickerController alloc] init]; 
    picker.delegate = self; 
    picker.allowsEditing = YES; 
    picker.sourceType = UIImagePickerControllerSourceTypePhotoLibrary; 

    _popover = [[UIPopoverController alloc] initWithContentViewController:picker]; 
    [_popover presentPopoverFromRect:button.frame inView:self.view permittedArrowDirections:UIPopoverArrowDirectionAny animated:YES]; 
} 
+2

Применяется только в UIUserInterfaceIdiomPad –

+0

@ iTroyd23 Это может быть взломан, добавив категорию UIPopoverController – yershuachu

+1

@yershuachu правой, так что вы замените один хак с другой? ;-) –

3

Modify выше метода кода

- (NSUInteger)supportedInterfaceOrientations 
{ 
    UIDeviceOrientation orientation = [[UIDevice currentDevice] orientation]; 
    if(orientation == UIDeviceOrientationLandscapeRight || orientation == UIDeviceOrientationLandscapeLeft) 
     return UIInterfaceOrientationMaskLandscape; 
    else 
     return UIInterfaceOrientationMaskPortrait; 
} 
1

Принятый ответ не работает для меня. Мне пришлось добавить modalPresentationStyle в UIImagePickerController, чтобы он работал.

UIImagePickerController *pickerController = [[UIImagePickerController alloc] init]; 
pickerController.modalPresentationStyle = UIModalPresentationCurrentContext; 
pickerController.delegate = self; 
pickerController.allowsEditing = YES; 
pickerController.sourceType = UIImagePickerControllerSourceTypePhotoLibrary; 
[self presentViewController:pickerController animated:YES completion:nil]; 

И, конечно же, не забудьте поставить это в делегата:

- (UIInterfaceOrientationMask)supportedInterfaceOrientations { 
    return UIInterfaceOrientationMaskLandscape; 
} 

Но согласно документации Apple, это не поддерживается, чтобы представить эту палитру в ландшафтном режиме, так быть осторожным.

6

... и я хочу создать его в ландшафтном режиме.

Одна строка кода может иметь большое значение! В методе или функции, где ваши IBAction земли:

В Swift,

let imagePickerController = UIImagePickerController() 
imagePickerController.delegate = self 
// .overCurrentContext allows for landscape and portrait mode 
imagePickerController.modalPresentationStyle = .overCurrentContext 

Objective-C,

UIImagePickerController *imagePickerController = [[UIImagePickerController alloc] init]; 
[imagePickerController setDelegate:self]; 
[imagePickerController setModalPresentationStyle: UIModalPresentationOverCurrentContext]; 

Примечание: Это позволит imagePickerController представить это мнение правильно, но воли май не исправляет проблему вращения, пока он представлен.

3

Вот версия, которая поддерживает поворот во всех направлениях интерфейса:

/// Not fully supported by Apple, but works as of iOS 11. 
class RotatableUIImagePickerController: UIImagePickerController { 

    override var supportedInterfaceOrientations: UIInterfaceOrientationMask { 
    return .all 
    } 
} 

Таким образом, если пользователь поворачивает ее устройство, оно будет обновить контроллер сборщика поддерживать текущую ориентацию. Просто создайте экземпляр, как обычно, UIImagePickerController.

Если вы хотите поддерживать только поднабор ориентации, вы можете вернуть другое значение.

1

Это отлично работает с Swift 4.0 в iOS 10/11.

import UIKit 

extension UIImagePickerController { 
    override open var supportedInterfaceOrientations: UIInterfaceOrientationMask { 
     return .all 
    } 
} 

Просто отпустите расширение где-нибудь в своем проекте, нет необходимости подклассифицировать что-либо для его работы.

Если вам необходимо указать типы устройств, вы можете добавить проверку, как это:

import UIKit 

extension UIImagePickerController { 
    override open var supportedInterfaceOrientations: UIInterfaceOrientationMask { 
     return UIDevice.current.userInterfaceIdiom == .phone ? .portrait : .all 
    } 
} 

Это позволить IPad свободно вращаться, но навязывает портретный режим на телефоне. Просто убедитесь, что ваше приложение настроено для поддержки их в своем info.plist, иначе вы можете столкнуться с сбоями при запуске сборщика.