2012-05-02 2 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. Также я не думаю, что это хорошая идея, чтобы вернуть другой объект, чем self в init. –

+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 Я заметил, что после того, как я написал это ха-ха ... вот почему я предложил вам сохранить оба vars в 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 в том, что полученное изображение не purgeable, так что рано или поздно вы получите проблемы с памятью.