L’interfaccia utente dell’applicazione per questo tutorial consisterà in una image view e due pulsanti. Quando saranno premuti dall’utente, il primo pulsante mostrerà la camera e quindi l’utente sarà in grado di scattare una foto e incorporarla nella image view. Il secondo pulsante consentirà l’accesso al rullino fotografico dove l’utente potrà selezionare una foto esistente. Nel caso di foto scattate queste saranno salvate nel rullino.
Lanciamo Xcode e creiamo un nuovo progetto di tipo Single-View Application.
L’applicazione che svilupperemo si basa sul framework MobileCoreService. Questo framwork deve essere aggiunto al progetto selezionandolo tra la lista di quelli esistenti. (Ecco la gioca su come fare).
La classe UIImagePickerControlller richiede un delegate per essere dichiarato, in aggiunta avremo bisogno di un outlet che consentirà l’accesso all’oggetto UIImageView nell’interfaccia utente dove le immagini verranno mostrate. Abbiamo, inoltre, bisogno di dichiarare due metodiche saranno chiamati e un flag booleano per indicare se l’immagine è stata salvata o no. Quindi per finire importiamo il framework. Ecco il risultato finale del file ViewController.h:
[code lang=”obj-c”]#import <UIKit/UIKit.h>
#import <MobileCoreServices/MobileCoreServices.h>
@interface ViewController : UIViewController{
UIImageView *imageView;
BOOL newMedia;
}
@property (strong, nonatomic) IBOutlet UIImageView *imageView;
– (IBAction)useCamera;
– (IBAction)useCameraRoll;
@end[/code]
Il prossimo passo è il disegno dell’interfaccia. È un’interfaccia molto semplice, non dovremo fare altro che aprire il file ViewController.xib e trasportare tutti i componenti nella view.
Adesso, Ctrl-Click sul File’s Owner e collegare tutti gli outlet e le azioni.
L’implementazione dei metodi
Le azioni useCamera e useCameraRoll adesso devono essere implementate. Il metodo useCamera ha prima di tutto bisogno di controllare che il dispositivo su cui l’applicazione sta girando ha una camera. Crea e alloca un’istanza UIImagePickerController ed assegna se stesso come delegate. Siccome non abbiamo in programma di gestire i video impostiamo un filtro per selezionare solo le immagini. Finalmente possiamo mostrare il controller. Come ultima cosa impostiamo il flag newMedia a YES in modo da indicare che se viene scattata una foto questa viene comunque salvata nel rullino.
Ecco il codice:
[code lang=”obj-c”]#import “ViewController.h”
@implementation ViewController;
@synthesize imageView;
.
.
– (void) useCamera
{
if ([UIImagePickerController isSourceTypeAvailable:
UIImagePickerControllerSourceTypeCamera])
{
UIImagePickerController *imagePicker =
[[UIImagePickerController alloc] init];
imagePicker.delegate = self;
imagePicker.sourceType =
UIImagePickerControllerSourceTypeCamera;
imagePicker.mediaTypes = [NSArray arrayWithObjects:
(NSString *) kUTTypeImage,
nil];
imagePicker.allowsEditing = NO;
[self presentModalViewController:imagePicker
animated:YES];
newMedia = YES;
}
}
.
.
@end[/code]
Usare il metodo useCameraRoll è molto simile al metodo precedente con l’eccezione che la sorgente è UIImagePickerControllerSourceTypePhotoLibrary e newMedia viene settato a NO poiché non abbiamo necessità di salvare una foto che già abbiamo.
[code lang=”obj-c”]- (void) useCameraRoll
{
if ([UIImagePickerController isSourceTypeAvailable:
UIImagePickerControllerSourceTypeSavedPhotosAlbum])
{
UIImagePickerController *imagePicker =
[[UIImagePickerController alloc] init];
imagePicker.delegate = self;
imagePicker.sourceType =
UIImagePickerControllerSourceTypePhotoLibrary;
imagePicker.mediaTypes = [NSArray arrayWithObjects:
(NSString *) kUTTypeImage,
nil];
imagePicker.allowsEditing = NO;
[self presentModalViewController:imagePicker animated:YES];
newMedia = NO;
}
}[/code]
Scriviamo i delegate
Come già descritto per implementare completamente l’image picker dobbiamo scrivere i metodi che controllano i delegate. Il più importante è il metodo didFinishPickingMediaWithInfo il quale è richiamato quando l’utente ha terminato di scattare o selezionare un’immagine.
[code lang=”obj-c”]-(void)imagePickerController:(UIImagePickerController *)picker
didFinishPickingMediaWithInfo:(NSDictionary *)info
{
NSString *mediaType = [info
objectForKey:UIImagePickerControllerMediaType];
[self dismissModalViewControllerAnimated:YES];
if ([mediaType isEqualToString:(NSString *)kUTTypeImage]) {
UIImage *image = [info
objectForKey:UIImagePickerControllerOriginalImage];
imageView.image = image;
if (newMedia)
UIImageWriteToSavedPhotosAlbum(image,
self,
@selector(image:finishedSavingWithError:contextInfo:),
nil);
}
else if ([mediaType isEqualToString:(NSString *)kUTTypeMovie])
{
// qui andrebbe il codice se volessimo supportare i video
}
}
-(void)image:(UIImage *)image
finishedSavingWithError:(NSError *)error
contextInfo:(void *)contextInfo
{
if (error) {
UIAlertView *alert = [[UIAlertView alloc]
initWithTitle: @\"Salvataggio fallito\"
message: @\"Fallito nel tentativo di salvare la foto.\"
delegate: nil
cancelButtonTitle:@\"OK\"
otherButtonTitles:nil];
[alert show];
}
}[/code]
Il codice in questo metodo chiude il picker ed identifica il tipo di media passato dal picker controller. Abbiamo inoltre aggiunto un metodo alla fine in moda da mostrarci un AlertView in caso fallisse il salvataggio.
Se però l’utente annulla il picker, lo chiudiamo richiamando questo altro delegate.
[code lang=”obj-c”]-(void)imagePickerControllerDidCancel:(UIImagePickerController *)picker
{
[self dismissModalViewControllerAnimated:YES];
}[/code]
Ricordiamoci sempre di svuotare la memoria allocata, ovviamente se abbiamo scelto ARC questo non è necessario.
[code lang=”obj-c”]- (void)viewDidUnload {
// Release any retained subviews of the main view.
// e.g. self.myOutlet = nil;
self.imageView = nil;
}[/code]
Abbiamo terminato. Ti consiglio di provare l’applicazione sul dispositivo in modo da provare anche la camera.