web-dev-qa-db-fra.com

Utilisation de UIImagePickerController en orientation paysage

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?

29
Paras Gorasiya

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:

enter image description here

Mais assurez-vous de vérifier Portrait dans les informations de déploiement:

enter image description here

47
Mc.Lover

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

30
David

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.

14
user1673099

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.

8
CodeBender

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.

6
Senseful

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];
}
5
iain

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;
 }
3
Abhishek Thapliyal

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.

2
Michal Cichon