я нахожусь в конце моей мудрости ...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