Вопрос

Я искал ответ на этот вопрос, но ничего не мог придумать.По-видимому, iPhone SDK 3.0 сделал возможным отображение UIImagePickerController в альбомном режиме, но я не нахожу никакого метода, который позволил бы это.Я бы подумал, что если приложение по умолчанию находится в альбомной ориентации, оно автоматически настроит контроллер изображения, но у меня это не работает.

Спасибо за любую помощь!

Это было полезно?

Решение

Я не проверял, является ли это незаконным, но у меня это сработало.Если вы хотите, чтобы UIImagePickerController запускался (и оставался) в коде альбомной ориентации:

//Initialize picker

UIImagePickerController * picker = [[UIImagePickerController alloc] init];
   picker.delegate = self;


//set Device to Landscape. This will give you a warning. I ignored it.
//warning: 'UIDevice' may not respond to '-setOrientation:'


[[UIDevice currentDevice] setOrientation:UIInterfaceOrientationLandscapeRight];

//Set Notifications so that when user rotates phone, the orientation is reset to landscape.
[[UIDevice currentDevice] beginGeneratingDeviceOrientationNotifications];

//Refer to the method didRotate:   
[[NSNotificationCenter defaultCenter] addObserver:self
              selector:@selector(didRotate:)
               name:@"UIDeviceOrientationDidChangeNotification" object:nil];

//Set the picker source as the camera   
picker.sourceType = UIImagePickerControllerSourceTypeCamera;

//Bring in the picker view   
[self presentModalViewController:picker animated:YES];

Метод не претерпел изменений:

- (void) didRotate:(NSNotification *)notification

{
      //Maintain the camera in Landscape orientation
 [[UIDevice currentDevice] setOrientation:UIInterfaceOrientationLandscapeRight];

}

Другие советы

Нет необходимости создавать подкласс;просто переопределите modalPresentationStyle собственность.

    UIImagePickerController *picker = [[UIImagePickerController alloc] init];
    picker.modalPresentationStyle = UIModalPresentationFormSheet;
    [viewController presentViewController:picker animated:YES completion:NULL];

Если вам просто нужно избавиться от предупреждения, попробуйте

@interface UIDevice ()
    -(void)setOrientation:(UIDeviceOrientation)orientation;
@end

Я разработал класс UIImagePicker в ландшафтном режиме.Отлично подходит для приложений, которые я разработал:надеюсь, у вас это тоже сработает:

ГитХаб: https://github.com/imaginaryunit/iOSLandscapeThreadedImagePicker.git

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

Я разработал простой способ решения этой проблемы, который использует делегат shouldAutorotate.Apple одобряет этот метод для полностью ландшафтного приложения.

Видишь здесь для получения подробной информации и загрузки полного исходного кода проекта.

Создайте категорию из Контроллер UINavigationController и добавьте этот метод

- (BOOL)shouldAutorotate
{
    return NO;
}

Подкласс UIImagePickerController и переопределить modalPresentationStyle следующим образом:

- (UIModalPresentationStyle)modalPresentationStyle
{
    if([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPad)
    {
        return UIModalPresentationFormSheet;
    }

    return [super modalPresentationStyle];
}

Средство выбора изображений теперь представляет собой лист формы и больше не находится в полноэкранном режиме, но оно хорошо смотрится в альбомном режиме.Это должно быть полностью безопасно для App Store.

Это работает для галереи, а не для фотосъемки.

Я решил эту проблему следующим образом:после каждого изменения ориентации я просто заново создаю средство выбора.Попробуй это.По-другому слишком криво...

Я разрабатываю класс, который изо всех сил старается работать в ландшафтном режиме.Проверьте это на GitHub: Контроллер RACameraController

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top