Creare una immagine a partire da una mappa

Le funzioni di Quartz sono veramente molto utili perché ci permettono di creare delle immagini e inserirle nell’interfaccia in maniera molto semplice ed efficace. Se però dobbiamo fare il passaggio inverso, ovvero ottenere una immagine a partire dall’interfaccia, come dobbiamo procedere?

In realtà questo è ancora più semplice e, se ad esempio stiamo parlando di un mapView , possiamo usare il seguente codice:

1
2
3
4
UIGraphicsBeginImageContextWithOptions(mapView.bounds.size, NO, 0.0f);
    [mapView.layer renderInContext:UIGraphicsGetCurrentContext()];
    UIImage *mapImage = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();
UIGraphicsBeginImageContextWithOptions(mapView.bounds.size, NO, 0.0f);
    [mapView.layer renderInContext:UIGraphicsGetCurrentContext()];
    UIImage *mapImage = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();

dove assegnamo al contex il render di un layer, e poi usiamo il contex per generare una UIImage. Tutto molto semplice.

Tip: includere un immagine in una mail con MFMailComposeViewController

Quando apriamo l’MFMailComposeViewController, come view modale, potremmo voler includere una immagine nel corpo del messaggio.

Nonostante su stackoverflow.com esista una soluzione per incorporare una immagine contenuta nel bundle dell’app, ritengo che, quando possibile, la soluzione migliore sia usare un corpo del messaggio in formato HTML e usare il tag img per usare una immagine caricata da remoto su un nostro server.

Questo richiede una connessione, ma ovviamente anche l’invio dell’email lo richiede. Inoltre l’immagine non grava sul peso totale del messaggio. Unico inconveniente è il non poter usare una immagine creata tramite l’app (a meno di complicati upload sul server, prima di creare il messaggio HTML).

Se però non abbiamo necessità particolare nell’impaginazione dell’immagine, possiamo utilizzare il semplice comando di creazione di un allegato (che Mail mostra comunque in automatico):

1
2
3
4
5
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    NSString *documentsDirectory = [paths objectAtIndex:0];
    NSString *dataFilePath = [documentsDirectory stringByAppendingPathComponent:imageName]; 
NSData *imageData = [NSData dataWithContentsOfFile:dataFilePath];
[mailComposer addAttachmentData:imageData mimeType:@"image/png" fileName:imageName];
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
	NSString *documentsDirectory = [paths objectAtIndex:0];
	NSString *dataFilePath = [documentsDirectory stringByAppendingPathComponent:imageName]; 
NSData *imageData = [NSData dataWithContentsOfFile:dataFilePath];
[mailComposer addAttachmentData:imageData mimeType:@"image/png" fileName:imageName];