2012-05-02 68 views
1

我已將子類UIImage創建爲UIImageExtra。我在UIImageExtra中有一個名爲adjustForResolution的方法,用於調整UIImage的大小。不過,我希望它返回一個UIImageExtra。我知道我需要轉換它,但不完全確定如何。基本上,如果我調整UIImageExtra的大小,它將成爲UIImage。將父類的實例轉換爲其子類

這裏是我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 
+0

我認爲你的imageByScalingAndCroppingForSize方法只是返回一個UIImage,所以你的init方法返回一個UIImage。另外我不認爲在init中返回比self更自然的對象是個好主意。 –

+1

imageByScalingAndCroppingForSize:裏面有什麼?你正在創建一個新的'UIImage'實例嗎? –

+0

@JonathanCichon是的,那麼如何確保它返回一個UIImageExtra實例,而不是UIImage? – Smikey

回答

1

難道是容易使的UIImage的類擴展到處理調整然後創建一個新的類從NSObject的繼承什麼,以保持兩個UIImages ..一個是原來的UIImage和其他調整大小的副本?

的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 

然後在您的自定義NSObject類在你的初始化會這麼像:

#import "UIImage+Extra" 

... 

//initialisation 

if (self) { 

    originalImage = [UIImage imageNamed:@"theimage.png"]; 
    resizedImage = [UIImage imageNamed:@"theimage.png"]; 
    [resizedImage adjustForResolution]; 

} 

只是輸入,所以可能有一些錯別字,但我希望它可以幫助

+0

這是一個很好的解決方案,但這實際上是一個類而不是類擴展。 –

+0

@ L14M333我擴展UIImage的原因是因爲我想添加一個iVar - originData。你不能添加iVars到類別。我也想擴展NSCoding方法,以確保originData屬性被保存... – Smikey

+0

@Smikey我注意到,我寫了它後哈哈...這就是爲什麼我建議你在NSObject(最後一段代碼片段)舉行兩個變種 – liamnichols

0

我想這是你想要做什麼:

- (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; 
} 

不使用contensOfFile代替initWithCGImage的缺點是,所得到的圖像不是吹出的,那麼你遲早會得到內存問題。