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

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

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

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

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

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

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

    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

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

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

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

    Другие frameworks, о которых сообщалось как о проблемах, include controller входа в систему Game Center.

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

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


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

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

    Здесь важна « Этот class предназначен для использования как есть и не поддерживает подclassирование ».


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

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

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

     - (NSUInteger)supportedInterfaceOrientations{ return UIInterfaceOrientationMaskLandscape; } 

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

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

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

     @interface NonRotatingUIImagePickerController : UIImagePickerController @end @implementation NonRotatingUIImagePickerController - (BOOL)shouldAutorotate { return NO; } @end 

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

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

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

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

      @implementation UIImagePickerController (NonRotating) - (BOOL)shouldAutorotate { return NO; } -(UIInterfaceOrientation)preferredInterfaceOrientationForPresentation { return UIInterfaceOrientationPortrait; } @end 

    Отчетность от iOS 7.1:

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

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

     -(NSUInteger)supportedInterfaceOrientations { return UIInterfaceOrientationMaskLandscape; } 

    Устранит проблему, но из iOs7

    Давайте будем гением компьютера.