Utiliser UIImagePickerController dans l'orientation du paysage

je crée une application qui est en mode paysage et j'utilise UIImagePickerController pour prendre des photos en utilisant Appareil photo iPhone en elle et je veux la créer en mode paysage aussi.

mais comme la documentation Apple suggère UIImagePickerController ne supporte pas l'orientation paysage, alors que dois-je faire pour obtenir la fonctionnalité désirée?

25
demandé sur iain 2013-10-15 10:01:00

8 réponses

si vous souhaitez utiliser UIImagePickerController en mode paysage, utilisez réponse de l'utilisateur 1673099 , mais au lieu de:

- (BOOL)shouldAutorotate
{
    return NO;
}

utiliser:

- (UIInterfaceOrientationMask)supportedInterfaceOrientations{
    return UIInterfaceOrientationMaskLandscape;
}

et alors le cueilleur ouvrirait en mode paysage:

enter image description here

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

enter image description here

46
répondu Mc.Lover 2018-03-01 13:10:27

... et je veux 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:

Swift", 151940920"

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];

Note: ceci permettra à imagePickerController de présenter sa vue correctement, mais will may ne pas régler la question de la rotation pendant qu'il est présenté.

19
répondu David 2017-02-28 18:11:55

Essayez par ici....

comme dans le document Apple, le contrôleur ImagePicker ne tourne jamais en mode paysage. Vous devez utiliser en mode Portrait seulement.

pour désactiver le mode paysage seulement pour le contrôleur ImagePicker suivre le code ci-dessous:

dans votre ViewController.m:

faire la sous-classe (NonRotatingUIImagePickerController) du contrôleur de Picker D'Image

@interface NonRotatingUIImagePickerController : UIImagePickerController

@end

@implementation NonRotatingUIImagePickerController
// Disable Landscape mode.
- (BOOL)shouldAutorotate
{
    return NO;
}
@end

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

12
répondu user1673099 2014-10-21 10:47:59

la façon correcte d'utiliser UIImagePickerController en mode paysage sans aucun pirate 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
répondu iain 2014-07-28 11:48:08

Voici une version qui supporte la rotation dans toutes les orientations de l'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 tourner son appareil, il mettra à jour le contrôleur de picker pour soutenir l'orientation actuelle. Comme vous le feriez normalement avec un Controller UIImagePickerController.

si vous voulez seulement supporter un sous-ensemble d'orientations, vous pouvez retourner une valeur différente.

5
répondu Senseful 2017-10-26 20:09:05

cela fonctionne très bien avec Swift 4.0 dans iOS 10/11.

import UIKit

extension UIImagePickerController {
    override open var supportedInterfaceOrientations: UIInterfaceOrientationMask {
        return .all
    }
}

il suffit de laisser tomber l'extension quelque part dans votre projet, pas besoin de sous-classe quoi que ce soit pour qu'il fonctionne.

si vous avez besoin de spécifier des types d'appareils, vous pouvez ajouter un contrôle comme ceci:

import UIKit

extension UIImagePickerController {
    override open var supportedInterfaceOrientations: UIInterfaceOrientationMask {
        return UIDevice.current.userInterfaceIdiom == .phone ? .portrait : .all
    }
}

cela permettra à un iPad de tourner librement, mais renforce le mode portrait sur un téléphone. Assurez-vous que votre application est configuré pour prendre en charge dans son info.plist, sinon vous pouvez rencontrer des accidents lors du lancement du picker.

5
répondu CodeBender 2017-10-26 22:41:34

modifier la méthode du code ci-dessus

- (NSUInteger)supportedInterfaceOrientations
 {
     UIDeviceOrientation orientation = [[UIDevice currentDevice] orientation];
     if(orientation == UIDeviceOrientationLandscapeRight || orientation == UIDeviceOrientationLandscapeLeft)
         return UIInterfaceOrientationMaskLandscape;
     else
         return UIInterfaceOrientationMaskPortrait;
 }
3
répondu Abhishek Thapliyal 2016-08-24 12:45:15

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 le mettre dans un contrôleur qui présente le picker:

- (UIInterfaceOrientationMask)supportedInterfaceOrientations {
    return UIInterfaceOrientationMaskLandscape; //this will force landscape
}

mais selon la documentation D'Apple ce n'est pas pris en charge pour présenter ce picker en mode paysage alors soyez prudent à ce sujet.

2
répondu Michal Cichon 2018-07-14 10:08:03