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
".
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
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.
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.
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)
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
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 ...