web-dev-qa-db-fra.com

Application iOS7 iPad Landscape uniquement, utilisant UIImagePickerController

Je crois que c'est un problème commun et de nombreuses réponses ne fonctionnent plus, beaucoup seulement partielles, si vous êtes sous iOS7 et que votre application iPad est en mode paysage uniquement, mais vous souhaitez utiliser le UIImagePickerController avec la source UIImagePickerControllerSourceTypePhotoLibrary ou UIImagePickerControllerSourceTypeCamera.

Comment le régler correctement, donc ça marche à 100%? Et vous n'obtenez pas d'orientations mixtes et évitez l'erreur "Les orientations prises en charge n'ont pas d'orientation commune avec l'application et shouldAutorotate renvoie YES".

32
Peter Lapisu

Si votre application iPad est en mode paysage dans toutes les conditions, procédez comme suit:

1) Dans votre délégué d'application

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

2) Créer un en-tête de catégorie

#import "UIViewController+OrientationFix.h"

@implementation UIViewController (OrientationFix)

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation {
    return UIInterfaceOrientationIsLandscape(toInterfaceOrientation);
}

- (BOOL)shouldAutorotate {
    return YES;
}

- (NSUInteger)supportedInterfaceOrientations {
    return UIInterfaceOrientationMaskLandscape;
}

@end

) Créer une implémentation de catégorie

#import "UIImagePickerController+OrientationFix.h"

@implementation UIImagePickerController (OrientationFix)

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation {
    return UIInterfaceOrientationIsLandscape(toInterfaceOrientation);
}

- (BOOL)shouldAutorotate {
    return YES;
}

- (NSUInteger)supportedInterfaceOrientations {
    return UIInterfaceOrientationMaskLandscape;
}

@end

Remarque: Vous n'avez pas besoin d'importer ces catégories n'importe où, juste assez pour qu'elles soient compilées avec le projet

Remarque: pas besoin d'implémenter ces méthodes dans n'importe quel VC

Remarque: pas besoin de changer les orientations prises en charge par plist

Ceci est testé et fonctionne dans toutes les conditions

83
Peter Lapisu

J'ai vu ce code dans l'exemple de code d'Apple.

UIImagePickerController *imagePickerController = [[UIImagePickerController alloc] init];
imagePickerController.modalPresentationStyle = UIModalPresentationCurrentContext;

Pour cette raison IModalPresentationCurrentContextUIImagePickerController sera ouvert selon l'orientation actuelle de l'appareil.

41
Chintan Prajapati

La documentation d'Apple indique:

"Important: La classe UIImagePickerController prend uniquement en charge le mode portrait."

Bien que cela fonctionne bien en paysage pour le plein écran et sur iOS 6.

référence de classe UIImagePickerController

1
Collin

Bien que la plupart des réponses recommandent d'utiliser .currentContext, J'ai découvert après avoir rejeté l'imagepicker, tout allait mal.

Sur un iPad paysagé, à mon humble avis il vaut mieux utiliser .formSheet:

let picker = UIImagePickerController()
picker.modalPresentationStyle = .formSheet
picker.sourceType = .photoLibrary
picker.delegate = self
self.present(picker, animated: true)
0
dOM

Merci à la suggestion de Peter Lapisu ci-dessus. Cela ne fonctionne pas pour moi (peut-être que je suis sur iOS 8.3) mais j'ai pu le modifier pour résoudre mes problèmes d'orientation. Mes codes sont ci-dessous

Délégué de l'application

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

Catégorie UIImagePickerController

@implement UIImagePickerController (extensions)
- (BOOL)shouldAutorotate {
    return YES;
}

- (NSUInteger)supportedInterfaceOrientations {
    return UIInterfaceOrientationMaskAll;
}

- (UIInterfaceOrientation)preferredInterfaceOrientationForPresentation {
    return [[UIApplication sharedApplication] statusBarOrientation];
}

@end

Catégorie UIViewController

@implementation UIViewController (extensions)

- (BOOL)shouldAutorotate {
    return YES;
}

- (NSUInteger)supportedInterfaceOrientations {
    return UIInterfaceOrientationMaskAll;
}

@end
0
Tien Dinh

Swift 4 Solution

Assurez-vous que lorsque vous avez le ViewController intégré dans un NavigationViewController pour y avoir le correctif. Cela ne fonctionnera pas en ajoutant cette restriction au ViewController alors ...

import UIKit

class MainNavigationViewController: UINavigationController {

    override var shouldAutorotate: Bool {
        return true
    }

    override var supportedInterfaceOrientations: UIInterfaceOrientationMask {
        return .landscape
    }
}

Et bien sûr, le code mentionné ci-dessus pour l'AppDelegate:

func application(_ application: UIApplication, supportedInterfaceOrientationsFor window: UIWindow?) -> UIInterfaceOrientationMask {
    return .all
}

Ce n'est nécessaire que pour iOS 10 et les versions antérieures. Apple semble l'avoir corrigé depuis iOS 11 et supérieur ...

0
simon