2011-10-27 7 views
1

я нахожусь в конце моей мудрости ...IOS: Рисование CGImage в подкласс CALayer во время пользовательского свойства анимации в правильном разрешении

У меня есть мнение, которое должно отображать анимированное круглое сечение, который предварительно -рандированные и доступные в виде png-файлов (как сетчатые, так и не-сетчатые версии, правильно названные; pie_p_000.png vs. [email protected]). Этот раздел должен быть анимирован в соответствии с изменением на некоторое процентное значение в приложении. Поэтому я создал подкласс UIView, который имеет собственный CALayer в своей иерархии слоев. Планируется реализовать пользовательское анимационное свойство для подкласса CALayer и изменить изображения в переопределенном методе drawInContext :. Пока все хорошо, план работал, и анимация отображается, когда я изменяю процентное значение с помощью функции setPercentageWithFloat: представления (полный источник ниже). Дело в том, что я действительно не знаю, почему мой iPhone4 всегда представляет изображение с низким разрешением. Я уже пробовал играть с масштабными факторами, но это не помогло. Либо изображения представлены в правильном размере и с низким разрешением, либо изображения представлены в двух размерах. Переопределение отображения: и настройка свойства содержимого напрямую влияет на то, что анимация не отображается (во время анимации изображение не отображается); после времени анимации представлено окончательное изображение. В этом случае отображается правильное изображение разрешения.

Btw: следующий код не очень сложный в обработке ошибок, гибкости и элегантности, но поскольку это попытка просто запустить эту вещь;) - поэтому изображение все еще отображается с переворачиванием и так далее ...

Я надеюсь, что у кого-то есть подсказка. Благодаря

представления:

#import "ScrollBarView.h" 
#import "ScrollBarLayer.h" 

@implementation ScrollBarView 

@synthesize sbl; 

- (id)initWithFrame:(CGRect)frame 
{ 
    self = [super initWithFrame:frame]; 
    if (self) { 
     // Initialization code 
    } 
    return self; 
} 

- (void)setImagesWithName:(NSString*)imageName { 
    ScrollBarLayer *ssbl = [[ScrollBarLayer alloc] init]; 
    ssbl.frame = CGRectMake(0, 0, 30, 30); 
    [ssbl setImagesWithName:imageName]; 
    [self.layer addSublayer:ssbl]; 

    self.sbl = ssbl; 

    [ssbl release]; 
} 

- (void) dealloc { 
    self.sbl = nil; 
    [super dealloc]; 
} 

- (void)setPercentageWithFloat:(CGFloat)perc { 
    if(perc > 1.0){ 
     perc = 1.0; 
    } else if(perc < 0) { 
     perc = 0; 
    } 

    [self.sbl setPercentage:perc]; 

    CABasicAnimation* ba = [CABasicAnimation animationWithKeyPath:@"percentage"]; 
    ba.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut]; 
    ba.duration = 0.8; 
    ba.toValue = [NSNumber numberWithFloat:perc]; 
    [self.sbl addAnimation:ba forKey:nil]; 
} 
@end 

The View можно настроить для работы с различными изображениями (с помощью функции setImagesWithName :), используя разные имена (theName). В рамках этого метода представление добавляет ScrollBarLayer к свойству слоя.

Слой:

#import "ScrollBarLayer.h" 

@implementation ScrollBarLayer 

@synthesize filename; 
@dynamic percentage; 

- (id)init { 
    self = [super init]; 
    if (self) { 

    } 
    return self; 
} 

- (void)setImagesWithName:(NSString*)imageName { 
    self.frame = CGRectMake(0, 0, 30, 30); 
    self.percentage = 0; 
    self.filename = imageName; 
} 

+ (BOOL) needsDisplayForKey:(NSString*)key { 
    if([key isEqualToString:@"percentage"]) { 
     return YES; 
    } 
    return [super needsDisplayForKey:key]; 
} 

- (void) drawInContext:(CGContextRef)ctx { 

    int imageIdx = (int)roundf((float)199 * self.percentage); 
    NSString *thisfilename = [self.filename stringByAppendingString:[NSString stringWithFormat:@"%03d.png", i+1]]; 
    UIImage* c = [UIImage imageNamed:thisfilename]; 
    CGImageRef img = [c CGImage]; 
    CGSize sz = CGSizeMake(CGImageGetWidth(img), CGImageGetHeight(img)); 

    UIGraphicsBeginImageContextWithOptions(CGSizeMake(sz.width, sz.height), NO, 0.0); 
    CGContextDrawImage(ctx, CGRectMake(0, 0, sz.width, sz.height), img); 
    UIGraphicsEndImageContext(); 
} 

- (void) dealloc { 
    self.pictures = nil; 
    self.filename = nil; 
    [super dealloc]; 
} 

@end 

ответ

0

мне также нужно будет свет на это.

Я думаю, что проблема между точками и пикселями ... Я думаю, что вы должны проверить, имеет ли устройство экран сетчатки, и если это так, вам следует заменить CGContextDrawImage (...) CGRect (во втором параметре) для одного с половиной ширины и высоты.

#define IS_RETINA_DISPLAY() ([[UIScreen mainScreen] respondsToSelector:@selector(scale)] == YES && [[UIScreen mainScreen] scale] == 2.00) 

... 
UIGraphicsBeginImageContextWithOptions(CGSizeMake(sz.width, sz.height), NO, 0.0); 

if (IS_RETINA_DISPLAY()) 
{ 
    CGContextDrawImage(ctx, CGRectMake(0, 0, sz.width/2.0f, sz.height/2.0f), img); 
} else 
{ 
    CGContextDrawImage(ctx, CGRectMake(0, 0, sz.width, sz.height), img); 
} 
UIGraphicsEndImageContext(); 
... 

Но я не уверен, что это жабры даст вам результат «гладкий» ...