19

Je crée une application en mode paysage et j'utilise UIImagePickerController pour prendre des photos avec l'appareil photo de l'iPhone et je souhaite également la créer en mode paysage. Mais comme la documentation d'Apple suggère UIImagePickerController ne supporte pas l'orientation paysage, alors que dois-je faire pour obtenir la fonctionnalité souhaitée?Utilisation de UIImagePickerController en orientation paysage

+0

Il semble fonctionner dans iOS 8 beta 4. Le seul problème est après avoir pris la photo, il vous montrera l'écran (utiliser cette photo ou annuler) en mode portrait. Mais l'image est bien capturée dans le paysage. –

Répondre

44

Si vous souhaitez utiliser UIImagePickerController en mode paysage, utilisez user1673099's answer, mais au lieu de:

- (BOOL)shouldAutorotate 
{ 
    return NO; 
} 

utilisation:

- (UIInterfaceOrientationMask)supportedInterfaceOrientations{ 
    return UIInterfaceOrientationMaskLandscape; 
} 

et le sélecteur ouvrirait en mode paysage:

enter image description here

Mais faire s Ure vous vérifiez Portrait dans les informations de déploiement:

enter image description here

+0

Cela fonctionne très bien. Une question, pourquoi devrions-nous vérifier Portrait dans les informations de déploiement? Je sais que c'est nécessaire mais je ne peux pas comprendre la raison. –

+2

@AnsonYao car 'UIImagePickerController' ne supporte que le mode Portrait. Si vous ne prenez pas en charge le portrait "globalement", le sélecteur d'image se bloquera car il n'a aucune orientation utilisable. – pkamb

+0

@ Mc.Avoir son fonctionnement si je vérifie le mode portrait dans les informations de déploiement. mais cela change simplement l'orientation de toute l'application.seriez-vous s'il vous plaît me dire comment puis-je résoudre ce problème –

11

Essayez de cette façon ....

Comme per Apple document, ImagePicker contrôleur Ne faites jamais tourner en mode paysage. Vous devez utiliser en mode Portrait uniquement.

Pour désactiver le mode paysage uniquement pour ImagePicker Controller suivre ci-dessous le code:

Dans votre ViewController.m:

Faire la SubClass (NonRotatingUIImagePickerController) de l'image Picker Contrôleur

@interface NonRotatingUIImagePickerController : UIImagePickerController 

@end 

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

Utilisation comme suit

UIImagePickerController* picker = [[NonRotatingUIImagePickerController alloc] init]; 
     picker.sourceType = UIImagePickerControllerSourceTypePhotoLibrary; 
     picker.delegate = self; 
    etc.... Just as Default ImagePicker Controller 

Cela fonctionne pour moi & Faites-moi savoir si vous avez un problème.

+0

Cela vous at-il aidé? – user1673099

+0

Je ne veux pas désactiver le mode paysage, je veux seulement utiliser le contrôleur de sélecteur d'image en mode paysage pas en mode portraite. Je veux savoir si je peux faire pivoter le sélecteur d'image pour prendre des photos aussi bien ou non ?? –

+0

@ParasGorasiya, ImagePicker ne supportera jamais le mode paysage. Il ne supporte que le mode Portrait. – user1673099

5

La bonne façon d'utiliser UIImagePickerController en mode paysage sans hacks 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]; 
} 
+2

uniquement applicable dans UIUserInterfaceIdiomPad –

+0

@ iTroyd23 Il peut être piraté en ajoutant la catégorie à UIPopoverController – yershuachu

+1

@yershuachu droit, vous remplacez un bidouille avec un autre? ;-) –

3

Modifier méthode ci-dessus code

- (NSUInteger)supportedInterfaceOrientations 
{ 
    UIDeviceOrientation orientation = [[UIDevice currentDevice] orientation]; 
    if(orientation == UIDeviceOrientationLandscapeRight || orientation == UIDeviceOrientationLandscapeLeft) 
     return UIInterfaceOrientationMaskLandscape; 
    else 
     return UIInterfaceOrientationMaskPortrait; 
} 
1

La réponse acceptée ne fonctionne pas pour moi. Je devais aussi ajouter modalPresentationStyle à UIImagePickerController pour le faire fonctionner.

UIImagePickerController *pickerController = [[UIImagePickerController alloc] init]; 
pickerController.modalPresentationStyle = UIModalPresentationCurrentContext; 
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 dans votre délégué:

- (UIInterfaceOrientationMask)supportedInterfaceOrientations { 
    return UIInterfaceOrientationMaskLandscape; 
} 

Mais selon la documentation d'Apple ce ne sont pas pris en charge de présenter ce sélecteur dans le mode paysage alors soyez prudent à ce sujet.

6

... 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ù vos terres IBAction:

Swift,

let imagePickerController = UIImagePickerController() 
imagePickerController.delegate = self 
// .overCurrentContext allows for landscape and portrait mode 
imagePickerController.modalPresentationStyle = .overCurrentContext 

Objective-C,

UIImagePickerController *imagePickerController = [[UIImagePickerController alloc] init]; 
[imagePickerController setDelegate:self]; 
[imagePickerController setModalPresentationStyle: UIModalPresentationOverCurrentContext]; 

Note: Ceci permettra imagePickerController de présenter sa vue correctement, mais le seront peut pas résoudre le problème de rotation alors qu'il est présenté.

3

est ici 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 tourne son appareil, il va mettre à jour le contrôleur de sélecteur pour soutenir l'orientation actuelle. Instanciez juste 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.

1

Cela fonctionne très bien avec Swift 4.0 dans iOS 10/11. Il suffit de laisser tomber l'extension quelque part dans votre projet, pas besoin de sous-classer quoi que ce soit pour que cela fonctionne.

Si vous avez besoin de spécifier les types de périphériques, vous pouvez ajouter un contrôle comme celui-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 en mode portrait fait respecter 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 risquez de rencontrer des plantages lors du lancement du sélecteur.