Подтвердить что ты не робот

Использование UIImagePickerController в альбомной ориентации

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

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

4b9b3361

Ответ 1

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

- (BOOL)shouldAutorotate
{
    return NO;
}

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

- (NSUInteger)supportedInterfaceOrientations{
    return UIInterfaceOrientationMaskLandscape;
}

а затем сборщик откроется в ландшафтном режиме:

enter image description here

Но не забудьте проверить портрет в информации о развертывании:

enter image description here

Ответ 2

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

В соответствии с Apple Document, ImagePicker Controller никогда не поворачивается в ландшафтном режиме. Вы должны использовать только в портретном режиме.

Для запрета Ландшафтный режим только для ImagePicker Controller приведен ниже:

В вашем ViewController.m:

Сделайте SubClass (NonRotatingUIImagePickerController) контроллера Image Picker

@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

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

Ответ 3

Правильный способ использования 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];
}

Ответ 4

Изменить метод кода

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

Ответ 5

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

Одна строка кода может иметь большое значение! В методе или функции, где приземляется ваш 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 правильно отображать его, но будет может не исправлять проблему вращения, пока он представлен.

Ответ 6

Здесь версия, которая поддерживает поворот во всех ориентациях интерфейса:

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

  override var supportedInterfaceOrientations: UIInterfaceOrientationMask {
    return .all
  }
}

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

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

Ответ 7

Принятый ответ не работает для меня. Мне также пришлось добавить 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 это не поддерживается, чтобы представить этот сборщик в ландшафтном режиме, поэтому будьте осторожны.

Ответ 8

Это отлично работает с 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, иначе вы можете столкнуться с сбоями при запуске сборщика.