2013-04-25 2 views
1

Я портирую существующее приложение iOS, чтобы изучить C4, и мне нужно использовать пользовательскую анимацию для слайд-изображения с эффектом «отскока» из-за экрана с помощью CAKeyframeAnimation.Пользовательские анимации для C4Image с CAKeyframeAnimation

Каков наилучший способ для меня реализовать более сложные анимации, подобные этому, используя C4?

Создание изображения

C4Image *v = [C4Image imageNamed:@"assets/images/ca/defense.png"]; 
v.frame = CGRectMake(1500, 300, 400, 400); // off screen 
[self addImage:v]; 

CAKeyframeAnimation используется в предыдущей реализации

CAKeyframeAnimation *animation = [CAKeyframeAnimation animationWithKeyPath:@"position.x"]; 
animation.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionLinear]; 
animation.duration = 0.5; 

int steps = 100; 
NSMutableArray *values = [NSMutableArray arrayWithCapacity:steps]; 
double value = 0; 
float e = 2.71; 
for (int t = 0; t < steps; t++) { 
    value = 200 * pow(e, -0.055*t) * cos(0.08*t) + x; //418 
    [values addObject:[NSNumber numberWithFloat:value]]; 
} 

animation.values = values; 
animation.removedOnCompletion = NO; 
animation.fillMode = kCAFillModeForwards; 
animation.delegate = self; 
animation.beginTime = CACurrentMediaTime() + delay; 

ответ

0

Все визуальные объекты С4 имеют свойство слоя, который вы можете получить доступ. Когда вы создаете CAKeyframeAnimation, вы можете использовать это свойство как объект, к которому вы добавляете анимацию.

Приведенный выше код работает довольно хорошо (хотя я немного изменил номера, чтобы убедиться, что объект был на холсте).

Я изменил код:

#import "C4WorkSpace.h" 

@implementation C4WorkSpace { 
    C4Image *v; 
} 

-(void)setup { 
    v = [C4Image imageNamed:@"C4Table"]; 
    v.origin = CGPointMake(self.canvas.center.x , self.canvas.center.y); 
    v.borderColor = C4RED; 
    v.borderWidth = 1.0f; 
    v.width = self.canvas.width/2.0f; 
    [self.canvas addImage:v]; 
} 

-(void)touchesBegan { 
    CAKeyframeAnimation *animation = [CAKeyframeAnimation 
             animationWithKeyPath:@"position.x"]; 
    animation.timingFunction = [CAMediaTimingFunction 
           functionWithName:kCAMediaTimingFunctionLinear]; 
    animation.duration = 0.5; 

    int steps = 100; 
    NSMutableArray *values = [NSMutableArray arrayWithCapacity:steps]; 
    double value = 0; 
    float e = 2.71f; 
    float x = v.origin.x; 
    for (int t = 0; t < steps; t++) { 
     value = 200 * pow(e, -0.025*t) * cos(0.08*t) - x; //418 
     [values addObject:@(value)]; 
    } 

    animation.values = values; 
    animation.removedOnCompletion = NO; 
    animation.fillMode = kCAFillModeForwards; 
    animation.delegate = self; 
    animation.beginTime = CACurrentMediaTime() + 1.0f; 

    [v.layer addAnimation:animation forKey:@"position.x"]; 
} 

@end 

Вы можете получить этот рабочий git repo

Главное, что я должен был сделать:

[v.layer addAnimation:animation forKey:@"position.x"]; 

Остальные изменения, которые я сделал были только координатами и цветами, чтобы убедиться, что все работает правильно.

+0

Ваша ссылка на суть не работает, и я не могу найти ее на вашем сайте. Куда он пошел? –

+0

Не знаете, что там произошло ... Я проверил код, и он работает хорошо. Я также исправил ссылку. –

+0

Спасибо за ссылку. Я просматривал Гисты, а не РЕПО. Благодарю. –

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