Ошибка при представлении UIImagePickerController под iOS 6.0

Мое приложение поддерживает только ландшафтные ориентации с помощью свойств supportedInterfaceOrientation.

Используя iOS до iOS 6, мое приложение может успешно загрузить экземпляр UIImagePickerController через presentViewController:animated:completion:, хотя сам UIImagePickerController поддерживает только портретную ориентацию.

Сборщик изображений просто представлял себя боком для пользователя. Пользователь повернул телефон, подобрал их изображение, а затем повернул обратно в пейзаж.

В iOS 6.0 вызов presentViewController:animated:completion: с экземпляром UIImagePickerController вызывает сбой приложения. Я могу предотвратить сбой, добавив параметры портрета в мои свойства supportedInterfaceOrientation.

Однако работа в портрете действительно не имеет смысла для моего приложения. Я подумал, что могу использовать shouldAutorotateToInterfaceOrientation, чтобы приложение могло "поддерживать портрет", но разрешено только поворачиваться к портрету в этом одном представлении. Но теперь этот метод устарел, и я не могу использовать ту же технику с shouldAutorotate.

Есть ли у кого-нибудь идеи, как я могу обойти эту проблему в iOS 6.0?

Ответ 1

iOS 6.1 - фиксированный

Как и в iOS 6.1, это больше не происходит, очень важно следовать моим советам, чтобы избежать сбоя в iOS 6.0.x, ниже все еще применяется к этому.


Обходное решение iOS 6.0.x

Это на самом деле ошибка в iOS 6.0, это должно быть исправлено в будущих выпусках iOS.

Инженер из Apple объяснил эту ошибку и обходной путь здесь: https://devforums.apple.com/message/731764

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

Примером этого может быть следующее:

Поддержка iPad в поддержку ландшафта отображает только UIImagePickerController через UIPopoverController. Для UIImagePickerController требуется Портретная ориентация, но приложение заставляет только пейзаж. ошибка и... авария

Другие фреймворки, которые были представлены как проблемные, включают контроллер входа в систему Game Center.

Обходной путь довольно прост, но не идеален... Вы сохраняете правильные ориентации, объявленные в вашей информационной области info.plist/project, но в классе делегирования приложения вы заявляете, что разрешаете все ориентации.

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


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

enter image description here

Важная вещь здесь: Этот класс предназначен для использования как есть и не поддерживает подклассы.


В моем случае я добавил это в свой делегат приложения (у меня есть только приложение с ландшафтом), это говорит о том, что он может отображать изображение, потому что поддерживается портрет:

- (NSUInteger)application:(UIApplication *)application supportedInterfaceOrientationsForWindow:(UIWindow *)window{
    return UIInterfaceOrientationMaskAll;
}

И затем в моем контроллере, который оказался UINavigationController, я включил категорию со следующим:

- (NSUInteger)supportedInterfaceOrientations{
    return UIInterfaceOrientationMaskLandscape;
}

Теперь мое приложение не вращается, и сборщик изображений спрашивает делегата, может ли он отображаться как портрет, и ему говорят, что все в порядке. Таким образом, все хорошо работает.

Ответ 2

У меня была аналогичная проблема, но в iPad-приложении для iPad. Я представлял сборщик изображений в popover. Он рухнул под iOS 6. Ошибка показала, что сборщик хотел портрет, но приложение предложило только пейзажные виды, и... что важно... сборщик shouldRotate возвращал YES.

Я добавил это в свой ViewControllerClass.m, который создает сборщик

@interface NonRotatingUIImagePickerController : UIImagePickerController

@end

@implementation NonRotatingUIImagePickerController

- (BOOL)shouldAutorotate
{
    return NO;
}

@end

а затем вместо этого использовал этот класс

UIImagePickerController *imagePicker = [[NonRotatingUIImagePickerController alloc] init];
[myPopoverController setContentViewController:imagePicker animated:YES];

Это решило проблему для меня. Ваша ситуация немного по-другому, но это походит на принципиально ту же ошибку.

Ответ 3

В то время как подклассификация UIImagePickerController работает, категория является лучшим решением:

    @implementation UIImagePickerController (NonRotating)

    - (BOOL)shouldAutorotate
    {
        return NO;
    }

    -(UIInterfaceOrientation)preferredInterfaceOrientationForPresentation
    {
        return UIInterfaceOrientationPortrait;
    }

    @end

Ответ 4

Отчеты из iOS 7.1:

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

Без этого ни один из приведенных выше кодов/исправлений не работал у меня.

Ответ 5

-(NSUInteger)supportedInterfaceOrientations
{
   return UIInterfaceOrientationMaskLandscape;
}

Будет исправлена ​​проблема, но из iOs7