Rispondiamo ad una richiesta di un nostro utente pubblicando questo interessante Tutorial di programmazione iPhone. Vi mostreremo come catturare con poche righe di codice un’istantanea (screenshot) della vostra App durante l’esecuzione del programma. Verrà quindi mostrata nell’app un’anteprima di quanto catturato e salvato lo screenshot direttamente nel “Rullino fotografico” del vostro iPhone. Partiamo subito con il nostro tutorial.
Apriamo Xcode, creiamo un nuovo progetto, dall’elenco dei template disponibili selezioniamo “View-based Application” e proseguiamo. Diamo un nome, ad esempio myScreenshot, decidiamo la posizione dove salvare e clicchiamo su “Save”.
Per prima cosa aggiungiamo il Framework “Quartz.Core”. Per farlo, clicchiamo col pulsante destro del mouse su “Frameworks” in “Groups & Files”, quindi su “Add” e infine su “Existing Frameworks…”. Nella finestra che si apre cercate e selezionate “Quartz.Core.framework” quindi cliccate su “Add”.
Apriamo quindi il file di intestazione “myScreenshotViewController.h” e modifichiamo il codice come segue:
#import
#import
@interface myScreenshotViewController : UIViewController {
IBOutlet UIImageView *anteprimaScreenshot;
}
@property (nonatomic, retain) IBOutlet UIImageView *anteprimaScreenshot;
-(IBAction)scattaIstantanea;
@end
Come vedete abbiamo semplicemente importato il framework, dichiarato un oggetto “IBOutlet” di tipo “UIImageView” e di nome “anteprimaScreenshot” che useremo appunto come anteprima e infine abbiamo dichiarato un metodo (IBAction) di nome “scattaIstantanea” che collegheremo successivamente ad un UIButton creato tramite Interface Builder.
Salviamo e passiamo alla creazione della semplice interfaccia grafica. Apriamo Interface Builder facendo doppio click sul file “myScreenshotViewController.xib” e trasciniamo nella vista i seguenti oggetti:
- N. 1 UIImageView
- N. 1 UIButton
Se volete potete “abbellire” la vostra vista inserendo altri elementi a piacere, come abbiamo fatto noi, anche se superflui per il funzionamento di questo progetto. Quello che dovete ottenere è qualcosa di simile a quanto mostrato in figura qui in basso:

Cliccate ora su “File’s Owner” e collegate gli oggetti appena creati, ai rispettivi oggetti e metodi creati precedentemente in Xcode. Collegate quindi “Image View” ad “anteprimaScreenshot” e il metodo “scattaIstantanea” al pulsante, facendo attenzione a selezionare “Touch Up Inside” al rilascio del mouse. Salviamo e chiudiamo Interface Builder.
Apriamo ora il file di implementazione “myScreenshotViewController.m” e andiamo a scrivere il codice vero r proprio che si occuperà di scattare lo screenshot, di mostrarlo in anteprima nell’UIImageView e di salvarlo nel “Rullino fotocamera” del nostro iPhone:
@synthesize anteprimaScreenshot;
-(void)alertDone {
UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"OK" message:@"Screenshot salvato nel Rullino fotografico" delegate:self cancelButtonTitle:@"OK" otherButtonTitles:nil];
;
;
}
-(IBAction)scattaIstantanea {
UIGraphicsBeginImageContext(self.view.bounds.size);
[self.view.layer renderInContext:UIGraphicsGetCurrentContext()];
UIImage *viewImage = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
UIImageWriteToSavedPhotosAlbum(viewImage, self, nil, nil);
[anteprimaScreenshot setImage:viewImage];
[self alertDone];
}
Come vedete il codice è molto semplice. Abbiamo inoltre aggiunto un UIAlert che viene mostrato dopo la pressione del tasto e ci informa che lo screenshot è stato correttamente salvato.
Potete salvare e provare il programma sull’iPhone Simulatore o direttamente sul vostro dispositivo, il risultato è mostrato in figura, ovviamente potrete verificare la presenza dell’immagine catturata sul vostro “Rullino fotografico”:

9 Responses to “T#035 – Creare uno screenshot a runtime”
19 Aprile 2010
RagazzettoGanzo davvero 😉
19 Aprile 2010
GinoVorrei aggiungere poche righe per spiegare come salvarla all’interno della propria applicazione (nella directory documents):
UIGraphicsBeginImageContext(self.view.frame.size);
[self.view.layer renderInContext:UIGraphicsGetCurrentContext()];
UIImage *viewImage = UIGraphicsGetImageFromCurrentImageContext();
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsDirectory = [paths objectAtIndex:0];
//inizio creazione nome univoco es photo-333.png
int randnum;
srand((unsigned)time(0));
randnum = (rand()%1000)+1;
NSString *nomeImmagine = [[NSString alloc ]
initWithFormat:@”photo-%d.png”, randnum];
printf(“Nome immagine random: %s”, [nomeImmagine UTF8String]);
//fine creazione nome univoco es photo-333.png
// Now we get the full path to the file
NSString *fullPathToFile = [documentsDirectory stringByAppendingPathComponent:nomeImmagine];
printf(“Path completo file:’%s’ “, [fullPathToFile UTF8String]);
[UIImagePNGRepresentation(viewImage) writeToFile:fullPathToFile atomically:YES];
spero serva a qualcuno
19 Aprile 2010
Alessandro MessineoSarà anche ganzo ma forse poco utile.. Perché nn parlate dei plist, loro gestione e lettura/scrittura, dato che mi sto accorgendo che vengono sempre sommariamente accennati nei libri di programmazione per iPhone e sono invece largamente utilizzati per immagazziare dati ed informazioni da mettere in TableView o in textView? 🙂
quella per me sarebbe una ganzata xD
complimenti sempre e cmq per il lavoro che fate 😉
19 Aprile 2010
Staff devAPPGrazie per i complimenti 🙂 L’utilità di questo tutorial, così come avviene per gli altri, è sicuramente differente per ognuno di noi. Questo, per esempio, è stato creato in risposta ad una particolare richiesta di un utente, per il quale sicuramente tornerà utile 😛
Ad ogni modo vedremo di parlare a breve anche dei file .plist e di mille altre cosette che sono spesso fondamentali..
purtroppo (o fortunatamente) le richieste che ci arrivano sono davvero tante.. in ogni caso, pian piano, faremo in modo di accontentare tutti
Nel frattempo dateci una mano postando le vostre richieste nella sezione apposita del nostro forum, che gli autori potranno sfruttare per prendere spunti 🙂
19 Aprile 2010
salvovolevo sapere se potete fare un tutorial di come fare una cecklist (come quelle per le figurine mancanti) e come far rimanere i dati salvati.
grazie
12 Novembre 2010
PaoloCiao a tutti… Si riesce a fare uno screenshot anke metter l’applicazione e’ in background?
Vorrei trasmettere quello k vedo in wifi sul iPad su un server remoto locale…
Grazie
Sempre ottime guide
14 Giugno 2011
tommasoc’è un modo per scattare l’istantanea solo nell’area della imageview?
28 Novembre 2011
LindaSalve!
Vorrei sapere se è possibile realizzare una simile applicazione che piuttosto che essere avviata dall’utente, si avvii da sola (ad esempio attivandola all’accensione) ed effettui uno screenshot a intervalli regolari senza che all’utente venga notificato nulla…
grazie!!!
29 Febbraio 2012
RagazzettoDomanda facile facile :
c’è un sistema perché le immagini salvate sul rullino abbiano una risoluzione retina se l’ applicazione gira su un dispositivo con display retina ?
con questo codice le immagini salvate sono di 320x 480 anche da iphone 4s !
Grazie in anticipo !