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

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

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

9 ответов

Решение

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

- (BOOL)shouldAutorotate
{
    return NO;
}

использовать:

- (UIInterfaceOrientationMask)supportedInterfaceOrientations{
    return UIInterfaceOrientationMaskLandscape;
}

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

введите описание изображения здесь

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

введите описание изображения здесь

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

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

В Свифте

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 правильно представить свой вид, но может не решить проблему поворота во время его представления.

Попробуйте так....

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

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

В вашем ViewController.m:

Создайте подкласс (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

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

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

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

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

  override var supportedInterfaceOrientations: UIInterfaceOrientationMask {
    return .all
  }
}

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

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

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

Изменить вышеуказанный метод кода

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

Если вы ищете решение SwiftUI в сочетании с упомянутыми здесь вещами, проверьте это здесь . Игнорирование безопасной области для представимого UIImagePickerController решило многие мои проблемы.

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

UIImagePickerController *pickerController = [[UIImagePickerController alloc] init];
pickerController.modalPresentationStyle = UIModalPresentationCurrentContext; //this will allow the picker to be presented in landscape
pickerController.delegate = self;
pickerController.allowsEditing = YES;
pickerController.sourceType = UIImagePickerControllerSourceTypePhotoLibrary;
[self presentViewController:pickerController animated:YES completion:nil];

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

- (UIInterfaceOrientationMask)supportedInterfaceOrientations {
    return UIInterfaceOrientationMaskLandscape; //this will force landscape
}

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

Другие вопросы по тегам