2013-06-21 14 views
8

pulsante che quando scatto mostra la macchina fotografica (funziona perfettamente)Utilizzando UIImagePickerController in UIView

- (IBAction)getPhoto:(id)sender 
{ 
    NSLog(@"Button clicked!"); 
    imagePicker = [[UIImagePickerController alloc] init]; 
    imagePicker.delegate = self; 

    if ([UIImagePickerController isSourceTypeAvailable:UIImagePickerControllerSourceTypeCamera]) { 
     [imagePicker setSourceType:UIImagePickerControllerSourceTypeCamera]; 
    } 

    else { // IF the device doesn't have a camera, so use the photos album 
     [imagePicker setSourceType:UIImagePickerControllerSourceTypeSavedPhotosAlbum]; 
    } 

    [self addSubview:imagePicker.view]; 
} 

Dopo che posso prendere una foto, ecc, ho - ma quando clicco "uso": non succede niente qui è il mio metodo: il selettore di immagini non si chiude da solo: l'applicazione semplicemente non fa nulla, sto cercando di prendere l'immagine che ho appena preso e mostrarla all'interno di un CGRect sullo schermo.

- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info { 
    [picker dismissViewControllerAnimated:YES completion:NULL]; 

    UIImageView *patientImage = [[UIImageView alloc] init]; 
    patientImage.frame = CGRectMake(625, 25, 83, 103); 

    UIImage *chosenImage = info[UIImagePickerControllerEditedImage]; 
    self.patientImage.image = chosenImage; 
} 

Anche quando ho colpito il pulsante di annullamento senza prendere un'immagine, l'imagePicker (interfaccia della fotocamera) non respingere per sé

Qualsiasi aiuto, consiglio, o di orientamento sarebbe molto apprezzato.

+0

patientImage.frame = CGRectMake (625, 25, 83, 103); ecco x è fuori dallo schermo del dispositivo :(così non puoi vedere l'immagine e anche [picker dismissViewControllerAnimated: YES completion: NULL]; alla fine del metodo –

+0

grazie Nitin, ma sto usando un ipad, quindi è in il mio schermo, e ho provato a spostare il licenziamentoVieController, senza successo –

+0

è PatientImage aggiunto a qualsiasi vista? come [self addSubview: patientImage]; –

risposta

4

Il metodo getPhoto: è nella sottoclasse UIView?

Se questo è il caso, allora sarebbe meglio:

  1. spostare il codice getPhoto: fuori dalla UIView sottoclasse del tutto, e lo mise in controller di vista padre della vista.

  2. Fai la tua UIButton una proprietà della vostra UIView: @property (nonatomic, strong) UIButton *myButton;

  3. Nel vostro controller della vista, impostare l'azione bersaglio & del pulsante come segue:

    [myView.myButton addTarget:self action:@selector(getPhoto:) forControlEvents:UIControlEventTouchUpInside]; 
    
  4. Infine, nella vostra getPhoto: metodo, chiamata [self presentViewController:imagePicker animated:YES completion:NULL];

  5. Il codice - (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info deve essere o andare nel controller della vista, cambiando self.patientImage.image = chosenImage; a myView.patientImage.image = chosenImage;

+0

riga 3 nel metodo viewdidload della classe ViewController Ottengo un errore che dice "PicBtn non trovato sull'oggetto di tipo myView" - ma ho dichiarato PicBtn come UIButton e come proprietà nell'intestazione della mia classe UIView "myView" –

+0

Per chi è interessato anche alla sua domanda Cosa ha detto @vinnyCoyne è stata la cosa giusta da fare. . . . ma invece di chiamare 'myView.myButton' è necessario creare prima un'istanza della classe myView e quindi chiamarla utilizzando il nome della variabile di istanza. Questo ha risolto il mio problema. . Grazie –

5

You shouldn't be doing the "addSubview" thing up there ma invece fare:

[self presentViewController:imagePicker animated:YES completion:nil]; 
+1

Il problema è presenteViewController è un metodo di UIViewController, ho bisogno di questa applicazione per funzionare all'interno di UIView, qualsiasi idea? –

+1

Una vista non dovrebbe essere responsabile per la presentazione di un altro controller.Questo va contro MVC, che è al centro di iOS. Si dovrebbe avere un controller di visualizzazione fare questo, come suggerito in questa risposta –

-1

Rimuovere il [self.addSubView:imagePicker.view]; e invece

[self presentViewController:imagePicker animated:YES completion:NULL];

Si respinge la variabile picker anche se picker non è definito. Metti invece:

[self dismissModalViewControllerAnimated:YES completion:NULL]; e assicurati che sia alla fine del tuo metodo.

1

non so perché il pulsante Annulla non funziona. Ma apporta questa modifica per selezionare l'immagine che stai cliccando.

Se si desidera annullare un evento, aggiungerlo creando UIBarButton personalizzato e aggiungerlo.

- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info { 

UIImageView *patientImage = [[UIImageView alloc] init]; 
patientImage.frame = CGRectMake(625, 25, 83, 103); 

UIImage *chosenImage = info[UIImagePickerControllerEditedImage]; 
self.patientImage.image = chosenImage; 

[imagePicker.view removeFromSuperview]; 

} 
1

Prova:

- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info { 
    [picker.view removeFromSuperview]; 

    UIImageView *patientImage = [[UIImageView alloc] init]; 
    patientImage.frame = CGRectMake(625, 25, 83, 103); 

    UIImage *chosenImage = info[UIImagePickerControllerEditedImage]; 
    self.patientImage.image = chosenImage; 
} 
5

Invece di aggiungere il selettore come una visualizzazione secondaria, si dovrebbe aggiungere il selettore a una UIPopoverController.

È quindi possibile visualizzarlo all'interno del tuo UIView sottoclasse utilizzando il metodo presentPopoverFromRect:inView:permittedArrowDirections:animated: popover in questo modo:

self.popover = [[UIPopoverController alloc] initWithContentViewController:imagePicker]; 
[self.popover presentPopoverFromRect:sender.frame inView:self permittedArrowDirections: UIPopoverArrowDirectionAny animated:YES]; 

Quindi, è possibile utilizzare i metodi delegato di respingere il popover utilizzando:

[self.popover dismissPopoverAnimatedYES]; 

È richiesto dal official docs:

La tabella indica che su iPad, se si specifica un tipo di origine di UIImagePickerControllerSourceTypePhotoLibrary o UIImagePickerControllerSourceTypeSavedPhotosAlbum, è necessario presentare l'immagine selettore utilizzando un controller popover, come descritto in “Presentare e respingendo il Popover” in UIPopoverController classe di riferimento. Se si tenta di presentare un selettore di immagini (schermo intero) per la scelta tra le immagini salvate e i filmati, il sistema solleva un'eccezione.

su iPad, se si specifica un tipo di origine di UIImagePickerControllerSourceTypeCamera, è possibile presentare l'immagine selettore modale (schermo intero) o utilizzando un popover. Tuttavia, Apple consiglia di presentare l'interfaccia della fotocamera solo a schermo intero.

Problemi correlati