tipos simple resueltos poo metodo llamar herencia ejercicios derivadas derivada como clases clase objective-c ios xcode uiimage subclassing

objective c - simple - Convertir instancia de una clase padre en su subclase



herencia simple en java (2)

He subclasificado UIImage para crear UIImageExtra. Tengo un método dentro de UIImageExtra llamado adjustForResolution que ajusta el tamaño del UIImage. Sin embargo, quiero que devuelva un UIImageExtra. Entiendo que necesito convertirlo pero no exactamente cómo. Básicamente, si cambio el tamaño de un UIImageExtra, se convierte en un UIImage.

Aquí está mi clase UIImageExtra:

#import "UIImageExtra.h" #import <objc/runtime.h> #import "UIApplication+AppDimensions.h" #define kOriginData @"originData" @implementation UIImageExtra @synthesize originData; + (UIImageExtra *)imageNamed:(NSString *)imageName origin:(NSValue *)originData { NSString *path = [[NSBundle mainBundle] pathForResource:imageName ofType:@""]; UIImageExtra *imageExtra = [[UIImageExtra alloc] initWithContentsOfFile:path]; imageExtra.originData = originData; return imageExtra; } - (id)initWithContentsOfFile:(NSString *)path { self = [super initWithContentsOfFile:path]; if (self) { self = [self adjustForResolution]; } NSLog(@"Image description: %@", [self description]); return self; } - (id)adjustForResolution { //All images are sized for ipad3 (2048 x 1536), so determine scale factor by ratio CGSize screenSize = [UIApplication currentSize]; double scalefactor = screenSize.width/2048; CGSize newSize = CGSizeMake(self.size.width*scalefactor, self.size.height*scalefactor); UIImage *scaledImage = [self imageByScalingAndCroppingForSize:newSize]; return scaledImage; } - (id)imageByScalingAndCroppingForSize:(CGSize)targetSize { //returns resized image } @end


¿Sería más fácil hacer una extensión de clase de UIImage para manejar el cambio de tamaño y luego crear una nueva clase que hereda de NSObject para contener dos UIImages ... Uno es el UIImage original y el otro la copia redimensionada?

UIImage + Extra.h:

#import <UIKit/UIKit.h> @interface UIImage (Extra) -(void)adjustForResolution; -(void)imageByScalingAndCroppingForSize:(CGSize)targetSize; @end

UIImage + Extra.m:

#import "UIImage+Extra.h" @implementation UIImage (Extra) - (void)adjustForResolution { //All images are sized for ipad3 (2048 x 1536), so determine scale factor by ratio CGSize screenSize = [UIApplication currentSize]; double scalefactor = screenSize.width/2048; CGSize newSize = CGSizeMake(self.size.width*scalefactor,self.size.height*scalefactor); [self imageByScalingAndCroppingForSize:newSize]; } - (id)imageByScalingAndCroppingForSize:(CGSize)targetSize { //instead of doing work to another object and returning it... Do it to self (UIimage) } @end

Luego, en su clase NSObject personalizada su init podría ser algo así como:

#import "UIImage+Extra" ... //initialisation if (self) { originalImage = [UIImage imageNamed:@"theimage.png"]; resizedImage = [UIImage imageNamed:@"theimage.png"]; [resizedImage adjustForResolution]; }

Simplemente tecleé eso para que haya algunos errores tipográficos pero espero que ayude


Creo que esto es lo que quieres hacer:

- (id)initWithContentsOfFile:(NSString *)path { CGSize screenSize = [UIApplication currentSize]; double scalefactor = screenSize.width/2048; if (scalefactor < 1) { UIImage *img = [UIImage imageWithContentsOfFile:path]; CGSize newSize = CGSizeMake(img.size.width*scalefactor, img.size.height*scalefactor); UIGraphicsBeginImageContext(newSize); CGContextRef c = UIGraphicsGetCurrentContext(); [img drawInRect:(CGRect){CGPointZero, newSize}]; CGImageRef scaledImage = CGBitmapContextCreateImage(c); UIGraphicsEndImageContext(); self = [super initWithCGImage:scaledImage]; CGImageRelease(scaledImage); }else { self = [super initWithContentsOfFile:path]; } return self; }

La desventaja de no usar contensOfFile en lugar de initWithCGImage es que la imagen resultante no se puede purgar, por lo que tarde o temprano tendrá problemas de memoria.