Ошибка при представлении 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