Je crée une application qui est en mode paysage et j'utilise UIImagePickerController
pour prendre des photos avec l'appareil photo de l'iPhone et je veux aussi la créer en mode paysage.
Mais comme la documentation Apple Apple suggère que UIImagePickerController
ne prend pas en charge l'orientation paysage, que dois-je faire pour obtenir les fonctionnalités souhaitées?
Si vous souhaitez utiliser UIImagePickerController en mode paysage, utilisez réponse de user1673099 , mais au lieu de:
- (BOOL)shouldAutorotate
{
return NO;
}
utilisation:
- (UIInterfaceOrientationMask)supportedInterfaceOrientations{
return UIInterfaceOrientationMaskLandscape;
}
puis le sélecteur s'ouvrait en mode paysage:
Mais assurez-vous de vérifier Portrait dans les informations de déploiement:
... et je veux aussi le créer en mode paysage.
Une ligne de code peut faire une grande différence! Dans la méthode ou la fonction où votre IBAction atterrit:
Dans Swift,
let imagePickerController = UIImagePickerController()
imagePickerController.delegate = self
// .overCurrentContext allows for landscape and portrait mode
imagePickerController.modalPresentationStyle = .overCurrentContext
Objectif c,
UIImagePickerController *imagePickerController = [[UIImagePickerController alloc] init];
[imagePickerController setDelegate:self];
[imagePickerController setModalPresentationStyle: UIModalPresentationOverCurrentContext];
Remarque: Cela permettra à imagePickerController de présenter correctement sa vue, mais volonté mai ne résout pas le problème de rotation pendant sa présentation.
Essayez de cette façon ....
Selon Apple Document, ImagePicker Controller ne pivote jamais en mode paysage. Vous devez utiliser en mode portrait uniquement.
Pour désactiver le mode paysage uniquement pour le contrôleur ImagePicker, suivez le code ci-dessous:
Dans votre ViewController.m:
Créer la sous-classe (NonRotatingUIImagePickerController) du contrôleur de sélecteur d'images
@interface NonRotatingUIImagePickerController : UIImagePickerController
@end
@implementation NonRotatingUIImagePickerController
// Disable Landscape mode.
- (BOOL)shouldAutorotate
{
return NO;
}
@end
Utilisez comme suit
UIImagePickerController* picker = [[NonRotatingUIImagePickerController alloc] init];
picker.sourceType = UIImagePickerControllerSourceTypePhotoLibrary;
picker.delegate = self;
etc.... Just as Default ImagePicker Controller
Cela fonctionne pour moi et faites-moi savoir si vous avez un problème.
Cela fonctionne très bien avec Swift 4. dans iOS 10/11.
import UIKit
extension UIImagePickerController {
override open var supportedInterfaceOrientations: UIInterfaceOrientationMask {
return .all
}
}
Déposez simplement l'extension quelque part dans votre projet, pas besoin de sous-classer quoi que ce soit pour que cela fonctionne.
Si vous devez spécifier des types d'appareils, vous pouvez ajouter une vérification comme celle-ci:
import UIKit
extension UIImagePickerController {
override open var supportedInterfaceOrientations: UIInterfaceOrientationMask {
return UIDevice.current.userInterfaceIdiom == .phone ? .portrait : .all
}
}
Cela permettra à un iPad de tourner librement, mais applique le mode portrait sur un téléphone. Assurez-vous simplement que votre application est configurée pour les prendre en charge dans son info.plist, sinon vous pourriez rencontrer des plantages lors du lancement du sélecteur.
Voici une version qui prend en charge la rotation dans toutes les orientations d'interface:
/// Not fully supported by Apple, but works as of iOS 11.
class RotatableUIImagePickerController: UIImagePickerController {
override var supportedInterfaceOrientations: UIInterfaceOrientationMask {
return .all
}
}
De cette façon, si l'utilisateur fait pivoter son appareil, il mettra à jour le contrôleur du sélecteur pour prendre en charge l'orientation actuelle. Instanciez simplement comme vous le feriez normalement un UIImagePickerController.
Si vous souhaitez uniquement prendre en charge un sous-ensemble d'orientations, vous pouvez renvoyer une valeur différente.
La bonne façon d'utiliser UIImagePickerController
en mode paysage sans aucun piratage est de le mettre dans un UIPopoverController
- (void)showPicker:(id)sender
{
UIButton *button = (UIButton *)sender;
UIImagePickerController *picker = [[UIImagePickerController alloc] init];
picker.delegate = self;
picker.allowsEditing = YES;
picker.sourceType = UIImagePickerControllerSourceTypePhotoLibrary;
_popover = [[UIPopoverController alloc] initWithContentViewController:picker];
[_popover presentPopoverFromRect:button.frame inView:self.view permittedArrowDirections:UIPopoverArrowDirectionAny animated:YES];
}
Modifier la méthode de code ci-dessus
- (NSUInteger)supportedInterfaceOrientations
{
UIDeviceOrientation orientation = [[UIDevice currentDevice] orientation];
if(orientation == UIDeviceOrientationLandscapeRight || orientation == UIDeviceOrientationLandscapeLeft)
return UIInterfaceOrientationMaskLandscape;
else
return UIInterfaceOrientationMaskPortrait;
}
La réponse acceptée ne fonctionne pas pour moi. J'ai également dû ajouter modalPresentationStyle à UIImagePickerController pour le faire fonctionner.
UIImagePickerController *pickerController = [[UIImagePickerController alloc] init];
pickerController.modalPresentationStyle = UIModalPresentationCurrentContext; //this will allow the picker to be presented in landscape
pickerController.delegate = self;
pickerController.allowsEditing = YES;
pickerController.sourceType = UIImagePickerControllerSourceTypePhotoLibrary;
[self presentViewController:pickerController animated:YES completion:nil];
Et bien sûr, n'oubliez pas de mettre cela dans un contrôleur qui présente le sélecteur:
- (UIInterfaceOrientationMask)supportedInterfaceOrientations {
return UIInterfaceOrientationMaskLandscape; //this will force landscape
}
Mais selon la documentation d'Apple, cela n'est pas pris en charge pour présenter ce sélecteur en mode paysage, alors soyez prudent.