2013-02-07 17 views
11

Ho creato un'applicazione per l'acquisizione di immagini dalla fotocamera. Questo è il mio codiceEccezione in iPad, UIImagePickerController deve essere presentato tramite UIPopoverController

-(IBAction) showCameraUI { 
    BOOL hasCamera = [UIImagePickerController isSourceTypeAvailable:UIImagePickerControllerSourceTypeCamera]; 
    UIImagePickerController* picker = [[UIImagePickerController alloc] init]; 
    picker.delegate = self; 
    picker.sourceType = hasCamera ? UIImagePickerControllerSourceTypeCamera : UIImagePickerControllerSourceTypePhotoLibrary; 
    [self presentModalViewController:picker animated:YES]; 
} 

e implementato questo metodo delegato per ottenere l'immagine catturata

- (void)imagePickerController:(UIImagePickerController *)picker 
didFinishPickingMediaWithInfo:(NSDictionary *)info 
{ 
    [picker dismissModalViewControllerAnimated:YES]; 
    UIImage* image = [info objectForKey:UIImagePickerControllerOriginalImage]; 
    UIImage *yourImageView = image; 
} 

Implementato questo metodo se l'utente annulla il controller

- (void)imagePickerControllerDidCancel:(UIImagePickerController*)picker 
{ 
    [picker dismissModalViewControllerAnimated:YES]; 
} 

Ma dimostra questa eccezione. Qualcuno ha idea del perché mostri tale eccezione dopo l'esecuzione dell'ultima riga della funzione showCameraUI.

UIStatusBarStyleBlackTranslucent is not available on this device. 2013-02-07 
10:06:06.976 CaptureImage[460:c07] *** Terminating app due to uncaught exception 
'NSInvalidArgumentException', reason: 'On iPad, UIImagePickerController must be 
presented via UIPopoverController' 
+1

qualcosa che non va, perché vedo il titolo questione _ “UIStatusBarStyleBlackTranslucent è non disponibile su questo dispositivo per iPad "_ – Tricertops

risposta

14

Per quanto riguarda l'eccezione, il messaggio di errore è molto chiaro. "Su iPad, UIImagePickerController deve essere presentato tramite UIPopoverController" Per iPad, è necessario presentarlo in un UIPopoverController invece di utilizzare [self presentModalViewController:picker animated:YES];. Questo dovrebbe risolvere il problema.

Per esempio: -

if ([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPad) { 
    UIPopoverController *popover = [[UIPopoverController alloc] initWithContentViewController:picker]; 
    [popover presentPopoverFromRect:self.view.bounds inView:self.view permittedArrowDirections:UIPopoverArrowDirectionAny animated:YES]; 
    self.popover = popover; 
} else { 
    [self presentModalViewController:picker animated:YES]; 
} 

Edit: Come menzionato da @rmaddy, fotocamera può essere presentato modale. Quanto sopra è applicabile quando sourceType è UIImagePickerControllerSourceTypePhotoLibrary.

+1

sì ho provato questo ma mostra questa eccezione motivo NSInvalidArgumentException: 'Applicatin cercato di presentare modally un controller attivo' Grazie mille per il tuo aiuto. – Arun

+1

Basta provare questo solo 'UIPopoverController * popover = [[UIPopoverController alloc] initWithContentViewController: picker]; [popover presentPopoverFromRect: self.view.bounds inView: self.view allowedArrowDirections: UIPopoverArrowDirectionAny animated: YES]; '. E non usare mai questa riga '[AutoModalViewController: picker animated: YES];' – iDev

+1

mostra il motivo 'NSGenericException': '- [UplopopController UIPopover] raggiunto mentre il popover è ancora visibile. Sono nuovo allo sviluppatore di ios quindi voglio un po 'di aiuto per migliorare le mie competenze dove dovrei iniziare il mio apprendimento, leggo un libro "Iniziare lo sviluppo di applicazioni per iPad" dove andare da qui – Arun

5

@Arun Mi trovo anch'io ad affrontare lo stesso problema, aggiungere la proprietà globale nel file di intestazione.

spero che il codice qui sotto è utile per voi

UIImagePickerController *imgPicker = [[UIImagePickerController alloc] init]; 
    [imgPicker setDelegate:self]; 
    [imgPicker setSourceType:UIImagePickerControllerSourceTypePhotoLibrary]; 
    [imgPicker setAllowsEditing:YES]; 
    [imgPicker setModalPresentationStyle:UIModalPresentationCurrentContext]; 

    UIPopoverController *popOver = [[UIPopoverController alloc] initWithContentViewController:imgPicker]; 
    popOver.delegate = self; 
    self.popoverImageViewController = popOver; 
    [self.popoverImageViewController presentPopoverFromRect:CGRectMake(0, 0, 160, 40) inView:self.view permittedArrowDirections:UIPopoverArrowDirectionAny animated:YES]; 

In questo file di intestazione creare proprietà globale come questo

@property (strong) UIPopoverController *popoverImageViewController; 
Problemi correlati