6

Si prega di notare che la risposta qui sotto - non funziona per iOS6 quindi ho ancora bisogno di una risposta!L'applicazione è abilitata solo per Portrait, ma UIImagePickerController ruota in iOS6

La mia applicazione è abilitata solo per la modalità Ritratto.

Tuttavia, se incorporo un UIImagePickerController all'interno come sottoview e ruoto il dispositivo, la barra superiore e inferiore rimane nella stessa posizione, tuttavia UIImagePickerController ruota.

Come posso evitare che ruoti?

Questo è il codice:

[self.view.window addSubview:self.imagePickerController.view]; 
    self.imagePickerController.showsCameraControls = NO; 
    self.imagePickerController.view.frame = CGRectMake(0, 90, 320, 320); 
    self.imagePickerController.allowsEditing = NO; 

a cura

Sto usando iOS6 dove shouldAutorotate non è essere calle

+0

Si prega di dare un'occhiata a: http://stackoverflow.com/questions/538041/uiimagepickercontroller-camera-preview-is-portrait-in-landscape-app – c0d3Junk13

risposta

12

Aggiungere questa categoria UIImagePickerController nella tua classe,

@interface UIImagePickerController(Nonrotating) 
- (BOOL)shouldAutorotate; 
@end 

@implementation UIImagePickerController(Nonrotating) 

- (BOOL)shouldAutorotate { 

    return NO; 
} 

@end 
+1

Cosa intendi aggiungendo nella tua classe? Potrebbe essere un file separato? se è così - come faccio ad accedervi? – Dejell

+0

@Odelya In yourClass.m prima di '@implementation yourClass' aggiungi questa categoria .. –

+0

Non funziona. Quando ruoto l'iPhone, ruota anche UIImagePickerController. Non ascolta nessuno dei metodi – Dejell

0

acceso e possibilità è ridefinire il metodo

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation; 

di UIImagePickerController. Non sono sicuro se questa sia la migliore possibilità, ma funzionerà.

Quindi, se volete solo il tuo UIImagePickerController per essere ruotato per ritratto utilizzare il seguente codice

@interface PortraitUIImagePickerController : UIImagePickerController 

@end 

E l'attuazione dovrebbe essere simile al seguente

@implementation PortraitUIImagePickerController 

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation 
{ 
    return UIInterfaceOrientationIsPortrait(toInterfaceOrientation); 
} 

@end 
+0

Sto usando iOS6 e shouldAutorotateToInterfaceOrientation è deprecato – Dejell

2

includere quanto segue nel controller questa volontà lavoro, sto creando la categoria UIImagePickerController

@interface UIImagePickerController (private) 

- (BOOL)shouldAutorotate; 
- (UIInterfaceOrientation)preferredInterfaceOrientationForPresentation; 
- (NSUInteger)supportedInterfaceOrientations; 
- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation; 

@end 


@implementation UIImagePickerController (Private) 

- (NSUInteger)supportedInterfaceOrientations { 

    return UIInterfaceOrientationMaskPortrait; 
} 

- (BOOL)shouldAutorotate { 

    return UIInterfaceOrientationMaskPortrait; 
} 

- (UIInterfaceOrientation)preferredInterfaceOrientationForPresentation { 
    return UIInterfaceOrientationPortrait; 
} 

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation 
{ 
    return (interfaceOrientation == UIInterfaceOrientationPortrait); 
} 
@end 
+0

Come si usa nel codice? Devo importare qualcosa? – Dejell

+0

appena passato nel file ViewController.m prima di @implementation. – junaidsidhu

+0

Vuoi dire che posso semplicemente creare 2 file h. e m., individuarli ovunque nel progetto e funzionerà? – Dejell

0

La categoria nella risposta più votata funziona, ma poiché è sconsigliato l'uso di categorie, è anche possibile creare una sottoclasse di UIImagePickerController e utilizzarla.

Se si vuole evitare la rotazione del UIImagePickerController aggiungere la seguente classe di

UINonRotatableImagePickerController.h

@interface UINonRotatableImagePickerController : UIImagePickerController 

@end 

UINonRotatableImagePickerController.m

@implementation UINonRotatableImagePickerController 

- (BOOL)shouldAutorotate 
{ 
    return NO; 
} 

@end 

Bisogna cambiare la classe UIImagePicker nel storyboard per utilizzare UILandscapeImagePickerController o se lo si assegna in codice, modificare

UIImagePickerController *picker = [[UIImagePickerController alloc] init]; 

a

UIImagePickerController *picker = [[UINonRotatableImagePickerController alloc] init]; 

e comprendono UINonRotatableImagePickerController.h nel codice.

+0

imagePicker è sempre Portrait e non supporta mai la sottoclasse, ruota solo se il selettore di immagini viene aggiunto come sottoview perché ruota a causa della superview, non di se stesso. – AsifHabib

+0

Forse è il caso dell'iPhone, ma ho il mio fullscreen imagepicker in landscape per l'iPad. – masam