Visto quanto sia comune il ridimensionamento di una immagine in un’applicazione, mi sorprende che questo metodo non sia stato incluso nella classe UIImage. Procediamo e prendiamoci cura di questa omissione aggiungendo un semplice metodo che fornirà un mezzo per ridimensionare l’immagine.
Useremo una “categoria” del linguaggio objective-c per aggiungere un metodo alla classe UIImage. Abbiamo già visto cosa sono nello specifico le categorie in questo articolo e anche qui, ed anche qui in modo più avanzato. Nessuna questione, le categorie sono vostre amiche in questi casi, dove abbiamo necessità di aggiungere funzionalità ad una classe esistente.
Definire la categoria
Per aggiungere un metodo alla classe UIImage, ci sono due passi a cui dobbiamo fare attenzione nella definizione dell’interfaccia. In primo luogo, creare una definizione di interfaccia per UIImage e aggiungere un nome di categoria all’interno di parentesi dopo la dichiarazione di interfaccia. In secondo luogo, creare la dichiarazione di metodo. Ecco un esempio:
[code lang=”obj-c”]
// UIImage+Scale.h
@interface UIImage (scale)
-(UIImage*)scaleToSize:(CGSize)size;
@end
[/code]
Implementare la categoria
[code lang=”obj-c”]
// UIImage+Scale.h
#import "UIImage+Scale.h"
@implementation UIImage (scale)
-(UIImage*)scaleToSize:(CGSize)size
{
// Creare un contesto grafico bitmap
// Questo sarà anche impostarlo come contesto attuale
UIGraphicsBeginImageContext(size);
// Disegna l’immagine ridimensionata nel contesto attuale
[self drawInRect:CGRectMake(0, 0, size.width, size.height)];
// Creare una nuova immagine da contesto
UIImage* scaledImage = UIGraphicsGetImageFromCurrentImageContext();
// Pop contesto attuale dallo stack
UIGraphicsEndImageContext();
// Restituisce la nostra nuova immagine in scala
return scaledImage;
}
@end
[/code]
Usare il metodo scaleToSize:
Chiamare il nuovo metodo scala appena aggiunto è davvero semplice:
[code lang=”obj-c”]
#import "UIImage+Scale.h"
…
// Creare l’immagine
UIImage *image = [UIImage imageNamed:@"myImage.png"];
// Scala l’immagine (25×35)
UIImage *scaledImage = [image scaleToSize:CGSizeMake(25.0f, 35.0f)];
[/code]
Esercizio per casa:
Realizzare una versione thread-safe per caricare immagini scalate in un table view.
PS: butta un occhio sul Grand Central Dispatch (GCD)