Con questo tutorial vedremo come sfruttare la fotocamera dell’iPhone, e le classi inerenti offerte da Apple, per prelevare una foto dal Rullino Fotografico, dalla libreria di foto o direttamente acquisendola con un nuovo scatto, per poterla poi utilizzare nella nostra applicazione come meglio crediamo. Apriamo Xcode, selezioniamo “View-based Application” dall’elenco dei template disponibili e proseguiamo. Scegliamo nome (ad esempio myPhoto) e posizione dove salvare il nostro progetto e andiamo avanti. Apriamo “myPhotoViewController.h” e impostiamo i due protocolli “UIImagePickerControllerDelegate, UINavigationControllerDelegate”. Dichiariamo un oggetto di tipo UIImageView e chiamiamolo imageView, dichiariamo infine i 3 metodi che ci permetteranno di eseguire le nostre scelte all’interno dell’applicazione. Il codice del file di interfaccia dovrebbe essere come segue:
#import
@interface myPhotoViewController : UIViewController {
IBOutlet UIImageView *imageView;
}
- (void)acquisisciFoto:(id)sender;
- (void)rullinoFotografico:(id)sender;
- (void)photoAlbum:(id)sender;
@end
Apriamo Interface Builder facendo doppio click sul file “myPhotoViewController.xib” e disegnamo la nostra interfaccia grafica. Inserite un UIImageView e 3 UIButton e modifichiamo le loro proprietà in modo da ottenere una vista simile a quella rappresentata in figura qui sotto:

Per una corretta visualizzazione delle immagini durante l’esecuzione, settiamo l’attributo “Mode” della UIImageView in modalità “Aspect Fit”. Colleghiamo quindi gli oggetti appena creati con quelli dichiarati da codice. UIImageView con imageView e i 3 pulsanti con i rispettivi metodi. Ricordate di scegliere l’opzione “Touch Up Inside” per gli UIButton.

Possiamo salvare, chiudere IB e tornare ad Xcode. Apriamo il file di implementazione “myPhotoViewController.m” e scriviamo il codice dei metodi dichiarati precedentemente:
- (void)acquisisciFoto:(id)sender{
UIImagePickerController *picker = [[UIImagePickerController alloc] init];
[picker setDelegate:self];
[picker setAllowsEditing:YES];
picker.sourceType = UIImagePickerControllerSourceTypeCamera;
[self presentModalViewController:picker animated:YES];
[picker release];
}
- (void)rullinoFotografico:(id)sender{
UIImagePickerController *picker = [[UIImagePickerController alloc] init];
[picker setDelegate:self];
[picker setAllowsEditing:YES];
picker.sourceType = UIImagePickerControllerSourceTypeSavedPhotosAlbum;
[self presentModalViewController:picker animated:(YES)];
[picker release];
}
- (void)photoAlbum:(id)sender{
UIImagePickerController *picker = [[UIImagePickerController alloc] init];
[picker setDelegate:self];
[picker setAllowsEditing:YES];
picker.sourceType = UIImagePickerControllerSourceTypePhotoLibrary;
[self presentModalViewController:picker animated:(YES)];
[picker release];
}
- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingImage:(UIImage *)image editingInfo:(NSDictionary *)editingInfo {
[imageView setImage:image];
[picker dismissModalViewControllerAnimated:YES];
}
-(void)imagePickerControllerDidCancel:(UIImagePickerController *)picker {
[picker dismissModalViewControllerAnimated:YES];
}
I primi 3 metodi sono praticamente identici, non facciamo altro che creare un oggetto di tipoUIImagePickerController, settare il suo delegato a self, impostare il suo metodo “AllowsEditing” a YES e decidere da dove deve essere prelevata la foto. Proprio qui troviamo l’unica differenza dei tre metodi. Useremo infatti “UIImagePickerControllerSourceTypeCamera” per avviare la fotocamera pronta a scattare una nuova foto, “UIImagePickerControllerSourceTypeSavedPhotosAlbum” per scegliere una fotografia dal Rullino Fotografico o “UIImagePickerControllerSourceTypePhotoLibrary” per sceglierla dal Photo Album. Avviamo quindi il “ModalViewController” e rilasciamo l’oggetto.
Gli ultimi due metodi servono per impostare la foto e nascondere il ModalViewController se abbiamo deciso di importare la foto o, nel caso in cui volessimo annullare l’operazione, di nascondere semplicemente tutto e tornare alla vista senza alcuna immagine importata.
Possiamo a questo punto salvare e testare la nostra applicazione, che su iPhone Simulator, se decidessimo di scattare una foto, si chiuderebbe inaspettatamente non essendo presente una fotocamera da poter utilizzare durante il test. Per provare tutte le funzioni consiglio quindi di installare direttamente l’applicazione sul vostro iPhone.
Ecco un’anteprima dell’applicazione in esecuzione:

Video Tutorial
by David Pollak












15 Responses to “T#007 – Sfruttiamo la fotocamera dell’iPhone”
15 Novembre 2009
CarloCome posso integrare uesto codice per realizzare un applicazione che invii e-mail con allegati?
16 Novembre 2009
Staff devAPPVuoi inviare le foto, scattate o prelevate dalla libreria, tramite e-mail da questa stessa applicazione? (apri un topic nel forum così la tua richiesta avrà maggiore visibilità anche con gli altri programmatori ;))
10 Dicembre 2009
Daniele– (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info {
[[picker parentViewController] dismissModalViewControllerAnimated:YES];
UIImage * img = [info objectForKey:@”UIImagePickerControllerEditedImage”];
if((img!=nil) && (imageView !=nil)) {
[imageView setImage:img];
}
}
così è meglio, quello usato dovrebbe essere deprecato.
ps: meglio ancora aggiungere un if prima di prendere l’immagine
if ([UIImagePickerController isSourceTypeAvailable:UIImagePickerControllerSourceTypePhotoLibrary]) {
UIImagePickerController *picker = [[UIImagePickerController alloc] init];
[picker setDelegate:self];
[picker setAllowsEditing:YES];
picker.sourceType = UIImagePickerControllerSourceTypePhotoLibrary;
[self presentModalViewController:picker animated:(YES)];
[picker release];
}else{
UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@”No photo library Available” message:@”Requires photo library to take pictures” delegate:nil cancelButtonTitle:@”OK” otherButtonTitles:nil];
[alert show];
[alert release];
}
25 Marzo 2010
Francesconella UIImageView non viene visualizzata la foto acquisita del primo metodo “acquisisciFoto”.
Come mai?
Il codice è identico a quello postato… senza errori…
25 Marzo 2010
FrancescoRisolto… anzi… ora funziona e non ho modificato nulla!
mah…
23 Maggio 2010
Fabionon è possibile salvare l’immagine anche quando chiudo l’app?
27 Dicembre 2010
SalvatoreE come si può usare la realtà aumentata?
17 Agosto 2011
Bobcome posso integrare la camera ad un menu ?Cioe con due progetti diversi come li associo ?
18 Novembre 2011
QuadrratoOttimo veramente.
Tutto molto semplice e chiaro!
Grazie
24 Novembre 2011
momone83Non riesco a capire perchè lo stesso codice in iOS4 funziona perfettamente, invece in iOS 5 nel caso del rullino o della libreria va inesorabilmente in crash! Sapete illuminarmi in merito??? Anche perchè il debugger non mostra un errore esplicito e comprensibile! Grazie in anticipo.
11 Gennaio 2012
NicolaCiao complimenti per i tutorial molto utili.
Ora ho da chiedere una cosa, io utilizzo ancora solo il simulatore per verificare il codice sviluppato (perché la mia conoscenza è ancora labile e non mi va di pagare 70$ per verificare che so caricare una foto dal rullino fotografico….).
Come faccio a caricare le foto sul simulatore come se stessero nel Rullino? e poi come faccio a far utilizzare la webcam del macbook come se fosse dell’iphone del simulatore?
29 Gennaio 2012
Giuseppe FratturaCiao ragazzi, vi seguo da molto e trovo i vostri tutorial molto utili.
Volevo chiedervi se e come fosse possibile modificare le impostazioni dello scatto della foto, ovvero ISO e tempo di apertura.
Grazie
Giuseppe Frattura
14 Febbraio 2012
PilodogCiao ragazzi mi chiedo se qualcuno mi possa aiutare a editare un codice x usare la fotocamera x leggere codici qr…..?… In attesa di una vostra risposta vi saluto
1 Marzo 2012
P4oloSalve a tutti e grazie mille per i bellissimi tutorial,
sto cercando di utilizzare la fotocamera/photoalbum inserendoli in un alertview.
Vi spiego meglio il mio problema, ho un alert view dove ho uno spazio per un immaginee uno spazio per il nome , vorrei quindi toccando sull’immagine avviare la fotocare (ad esempio), qui sorge il problema ovvero l’operazione viene eseguita correttamente ma una volta aperta la fotocamere è come se non riconescesse piu’ il touch tutto quindi rimane bloccato e non posso piu’ fare nulla. 🙁
Nel caso invece dell’album fotografico rimane come illuminato centralmente e se prova a toccare l’applicazione si chiude.
Ho provato diverse strade ma non riesco a venirne a capo probabilmente non gestisco bene i controller ( anzi quasi sicuramente) vi invio il pezzo di codice dell’alert
———————————————————–
NSString *spazi=@”\n\n\n\n\n”;
NSString *b=[spazi stringByReplacingOccurrencesOfString:@”\\n” withString:@”\n”];
popUp1 = [[UIAlertView alloc] initWithTitle:NSLocalizedString(@”INSNOME”, @””)
message:b delegate:nil cancelButtonTitle:@”OK” otherButtonTitles:nil];
var2=@”l11″;
testo = [[UITextField alloc] initWithFrame:CGRectMake(20.0, 120, 245.0, 25.0)];
[testo setBackgroundColor:[UIColor whiteColor]];
testo.text=l11.text;
testo.autocorrectionType = UITextAutocorrectionTypeNo;
testo.delegate = self;
btft1 = [UIButton buttonWithType:UIButtonTypeCustom];
btft1.frame = CGRectMake(110,47, 60, 70); // position in the parent view and set the size of the button
[btft1 setImage:[UIImage imageNamed:@”sagoma.jpg”] forState:UIControlStateNormal];
[btft1 addTarget:self action:@selector(mimg) forControlEvents:UIControlEventTouchUpInside];
btft1.showsTouchWhenHighlighted=YES;
[popUp1 addSubview:testo]; // inserisco il label precedentemente creato
[popUp1 addSubview:btft1]; // inserisco il bottone che utilizzo da immagine precedentemente creato
[popUp1 show];
[popUp1 release];
—————————–
-(IBAction)mimg{
[popUp1 removeFromSuperview];
UIImagePickerController *picker = [[UIImagePickerController alloc] init];
[picker setDelegate:self];
[picker setAllowsEditing:YES];
picker.sourceType = UIImagePickerControllerSourceTypeCamera;
[self presentModalViewController:picker animated:YES];
[picker release];
}
Vi ringrazio già per la pazienza
a presto Ciaoooooooo
27 Novembre 2012
Andrea RossiRagazzi Ciao ho un problema!! Sono alle prime armi e mi da errore qua :
– (void)acquisisciFoto:(id)sender “” {
UIImagePickerController *picker = [[UIImagePickerController alloc]init];
[picker setDelegate:self];
[picker setAllowsEditing:YES];
picker.sourceType = UIImagePickerControllerSourceTypeCamera;
[self presentModalViewController:picker animated:YES];
[picker release];
}
…dove ho messo “” il mio xcode che è l’ultimo e mi dice di inserire il ; ma facendo in questo modo mi da errore!!! COME POSSO FARE????? Vi ringrazio in anticipo (aspetto le vostre risposte)
grazie mille e buon lavoro a presto ciao!