41 votes

Crash sur la présentation de UIImagePickerController sous iOS 6.0

Mon application ne supporte paysage par l' supportedInterfaceOrientation propriétés.

À l'aide d'un iOS antérieures à iOS 6, mon application peut charger avec succès une instance d' UIImagePickerController par presentViewController:animated:completion: même si l' UIImagePickerController lui-même prend uniquement en charge le mode portrait.

Le sélecteur d'images simplement en se présentait, à côté de l'utilisateur. L'utilisateur fait pivoter le téléphone, cueillis à leur image, et alors a tourné le dos au paysage.

Sous iOS 6.0, appelant presentViewController:animated:completion: avec l' UIImagePickerController exemple bloque l'application. Je ne peux empêcher le crash en ajoutant portrait d'options pour ma supportedInterfaceOrientation propriétés.

Cependant, l'exploitation en mode portrait n'a vraiment pas de sens pour mon application. J'avais pensé que je pourrais utiliser shouldAutorotateToInterfaceOrientation afin de permettre l'application d'aider "portrait", mais seulement être autorisé à tourner à portrait dans cette vue. Mais maintenant que la méthode est obsolète, et je ne peux pas utiliser la même technique avec shouldAutorotate.

Quelqu'un a une idée comment je peux contourner ce problème sous iOS 6.0?

80voto

Daniel Points 14150

iOS 6.1 - fixe

Comme d'iOS 6.1, cela ne se produit plus, il est très important de suivre mes conseils afin d'éviter un crash sous iOS 6.0.x, le ci-dessous s'applique toujours à que les.


iOS 6.0.x solution de contournement

C'est en fait un bug dans iOS 6.0, cela devrait être corrigé dans les futures versions du logiciel iOS.

Un ingénieur d'Apple, a expliqué ce bug et une solution de contournement: https://devforums.apple.com/message/731764

Ce qui se passe parce que l'Application veut orientation paysage, mais certains Cocoa Touch Afficher les Contrôleurs exigent strictement orientation Portrait qui est l'erreur - non pas qu'ils doivent être exigeant plus de Portrait, mais leur interprétation des besoins des Applications.

Un exemple de ceci peut être la suivante:

l'application iPad de l'appui paysage affiche uniquement une UIImagePickerController par l'intermédiaire d'un UIPopoverController. Le UIImagePickerController exige En orientation Portrait, mais l'app est de forcer paysage uniquement. Erreur et crash...

D'autres cadres qui ont été signalés comme étant problématiques incluent le Centre de Jeu de connexion view controller.

La solution est assez simple, mais pas idéal... Vous gardez les orientations correctes déclaré dans votre info.plist/projet volet d'informations, mais dans l'Application de Délégué de classe, vous déclarez que vous permettre à toutes les orientations.

Maintenant, chaque point de Vue Contrôleur de vous ajouter à la fenêtre doit spécifier lui-même qu'il ne peut être le Paysage. Veuillez vérifier le lien pour plus de détails.


Je ne peux pas insister sur la façon dont beaucoup vous ne devriez pas être sous-classement UIImagePickerController que la solution retenue est d'insister vous ne.

enter image description here

La chose importante ici est "Cette classe est destiné à être utilisé comme tel et ne prend pas en charge les sous-classement."


Dans mon cas, j'ai ajouté ceci à ma demande du délégué (j'ai un paysage seule application), ce qui signifie que le sélecteur d'images qu'il peut afficher, parce que le portrait est pris en charge:

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

Et puis de mon point de vue contrôleur qui est arrivé à être un UINavigationController, j'ai inclus une catégorie à la suivante:

- (NSUInteger)supportedInterfaceOrientations{
    return UIInterfaceOrientationMaskLandscape;
}

Maintenant, mon application ne permet pas de tourner, et le sélecteur d'images demande le délégué s'il peut afficher que le portrait et il dit que c'est normal. Donc tout se joue bien.

41voto

eclux Points 599

J'ai eu un problème similaire, mais dans un iPad paysage app. J'ai présenté le sélecteur d'images dans une liste. Il s'est écrasé sous iOS 6. L'erreur a suggéré que le sélecteur voulais portrait, mais l'app seulement offert à la vue paysage, et ... surtout ... le sélecteur de shouldRotate était de retour OUI.

J'ai ajouté à mon ViewControllerClass.m qui est de la création du sélecteur de

@interface NonRotatingUIImagePickerController : UIImagePickerController

@end

@implementation NonRotatingUIImagePickerController

- (BOOL)shouldAutorotate
{
    return NO;
}

@end

et ensuite utilisé cette classe au lieu

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

Qui a résolu le problème pour moi. Votre situation est un peu différente, mais elle sonne comme fondamentalement la même erreur.

26voto

Jonah.at.GoDaddy Points 1912

Alors que le sous-classement UIImagePickerController œuvres, une catégorie est une meilleure solution:

    @implementation UIImagePickerController (NonRotating)

    - (BOOL)shouldAutorotate
    {
        return NO;
    }

    -(UIInterfaceOrientation)preferredInterfaceOrientationForPresentation
    {
        return UIInterfaceOrientationPortrait;
    }

    @end

1voto

cookeecut Points 66

Reporting à partir d'iOS 7.1:

En plus de ce que les réponses ci-dessus, préciser, il semble que vous devez absolument activer le mode portrait dans l'info.plist.

Sans cela, aucun code ci-dessus/correctifs a fonctionné pour moi.

1voto

ANIL.MUNDURU Points 13
-(NSUInteger)supportedInterfaceOrientations
{
   return UIInterfaceOrientationMaskLandscape;
}

Résoudre le problème, mais à partir de iOs7

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X