2010-06-20 2 views
3

У меня есть CALayer, который реализует drawInContext: и рисует простой круг, вот так:Animate CALayer масштаб без размытия

- (void)drawInContext:(CGContextRef)ctx 
{ 
    CGContextScaleCTM(ctx, DrawingScale, DrawingScale); 
    CGContextSetRGBFillColor (ctx, 1, 0, 0, 1); 
    CGContextFillEllipseInRect (ctx, LocationRectangle); 
} 

Я экспериментировал с различными способами увеличения размера моего круга, основанный на ощупь мероприятие. Я пробовал использовать систему beginAnimation UIView и CABasicAnimation, но все они размывают изображение. В моем чтении я обнаружил, что это связано с тем, что CALayer, похоже, обрабатывается как растровые изображения для этих параметров.

Справедливо ... но я хочу масштабировать свою графику без размытия, например. для использования векторного масштабирования.

Таким образом, в моем коде у меня есть свойство DrawingScale.

Есть ли опрятный способ масштабирования этого свойства с помощью анимации слоя? Или это то, что люди делают с NSTimers (yuk)?

Возможно, это одна из ситуаций, когда я могу использовать способность Core Animation для анимации пользовательских свойств? Если это так, я хотел бы узнать, какой пример люди находят, это лучшее, или какой раздел документов Apple может быть хорошим местом для начала этой темы.

Кажется, что когда речь заходит о графике на Mac/iOS, есть много способов кожного покрова/нарисовать кошку ...?

ответ

3

После нескольких дней работы над этим решением я должен иметь переменную с именем «DrawingScale» в качестве переменной-члена (это то, что они вызывают в Obj-C) и использование Core Animation для анимации этого свойства ,

- (void)drawInContext:(CGContextRef)ctx 
{ 
    CGFloat size = (CGFloat)(DrawingScale*DEFAULT_SIZE); 
    CGRect elipseRect = CGRectMake(xPos, yPos, size, size); 
    CGContextStrokeEllipseInRect(ctx, elipseRect); 
    CGContextFillEllipseInRect (ctx, elipseRect); 
} 

Затем на мероприятии, я создал анимацию как таковой:

-(void) : (CGPoint) location 
{ 
    /* Set up an explicit animation to scale the players size up */ 
    CABasicAnimation* anim = [CABasicAnimation animationWithKeyPath:@"DrawingScale"]; 
    anim.fromValue = [NSNumber numberWithFloat: 1]; 
    anim.toValue = [NSNumber numberWithFloat: 5]; 
    anim.removedOnCompletion = YES; 
    anim.duration = 0.1; 
    anim.delegate = self; 
    anim.fillMode = kCAFillModeForwards; 
    anim.autoreverses = NO; 
    [self addAnimation: anim forKey:@"ElipseGettingBigger"]; 
} 

Это создает анимацию, чтобы установить свою переменную DrawingScale в диапазоне от 1 до 5, и сделать это в течение 0,1 с Второй. Он работает очень хорошо.

Мне нужно было быть осторожным и убедиться, что я сначала скорректировал границы слоев!

+1

Это действительно крутое исправление; Спасибо, что поделился. –

2

Используйте слой с фигурой (CAShapeLayer). Вы передаете ему путь, цвет заливки и цвет обводки, и он будет сохранять все ваши края четкими, независимо от масштаба. Если все, что вам нужно, это круг, вы можете просто обмануть и создать слой, угловой радиус которого равен половине ширины и высоты (предполагая идеальный квадрат/круг). Что-то вроде:

CALayer *layer = [CALayer layer]; 
[layer setMasksToBounds:YES]; 
[layer setBackgroundColor[[UIColor redColor] CGColor]]; 
[layer setCornerRadius:25.0f]; 
[layer setBounds:CGRectMake(0.0f, 0.0f, 50.0f, 50.0f)]; 
[layer setPosition:CGPointMake([view bounds].size.width/2.0f, 
           [view bounds].size.height/2.0f]); 

[[view layer] addSublayer:layer]; 

Вы также можете захотеть взглянуть на latest WWDC videos from Apple. В Core Animation есть три сеанса. Обсудите масштабирование слоя и сохраните края. Видеоролики бесплатны.

С уважением.

+0

Спасибо за ответ Matt. На данный момент это всего лишь круг, но это будет больше. Но мне понравилось творческое решение :-) Nifty little cheat. У меня будет игра с CALayer! Забавно, что вы упоминаете видео в WWDC, я только что увидел письмо от Apple об этих и скачал несколько Gb стоит. Теперь я просто должен найти много часов, чтобы посмотреть их все :-) Я выложу решение, которое я использовал в то же время также – Fuzz

Смежные вопросы