2016-01-26 3 views
0

Так что я пытаюсь CABasicAnimation в первый раз. Я пытаюсь применить его на слое, и я хочу, чтобы слой интерполировался из одной точки в другую. Я изначально установил отрицательную координату x, и я положил анимацию на бесконечность. Он работает, но на экране требуется несколько секунд. Поэтому он должен полностью пройти до конца и начать снова. Ниже приведен кодCABasicAnimation появляется на экране с некоторым отрывом

[[self bgImageView] setImage:[UIImage imageNamed:@"bg_dynamicwx_cloudyday_3.jpg"]]; 
for (CALayer *layer in self.emitterView.layer.sublayers) { 
    [layer removeAllAnimations]; 
} 

[self.emitterView.layer removeAllAnimations]; 
NSArray *subLayers = self.emitterView.layer.sublayers; 
for (CALayer *layer in subLayers) { 
    [layer removeFromSuperlayer]; 
} 

CALayer *mask = [CALayer layer]; 
UIImage *layerImg = [UIImage imageNamed:@"2_cloud.png"]; 
mask.bounds = CGRectMake(self.emitterView.bounds.origin.x, self.emitterView.bounds.origin.y, layerImg.size.width, layerImg.size.height); 
mask.contents = (id)layerImg.CGImage; 

CGPoint fromPoint = CGPointMake(-layerImg.size.width, 0); 
CGPoint toPoint = CGPointMake(layerImg.size.width, 0); 

mask.position = fromPoint; // CoreAnimation animations do *not* persist 

CABasicAnimation *animation = [CABasicAnimation animationWithKeyPath:@"position"]; 
animation.fromValue = [NSValue valueWithCGPoint:fromPoint]; 
animation.toValue = [NSValue valueWithCGPoint:toPoint]; 
animation.duration = 150; 
animation.repeatCount = INFINITY; 

[mask addAnimation:animation forKey:@"position"]; 
[self.emitterView.layer addSublayer:mask]; 

В основном я пытаюсь облачную анимацию, где облако плавает по экрану. Я почти уверен, что у меня есть некоторая концепция, неправильная здесь для базовой анимации. Поскольку продолжительность составляет 150 (она должна быть тонкой), на анимацию требуется бесконечно. Похоже, что положение за кадром больше, чем то, что я дал. Image Я использую для слоя 728 по 368.

ответ

1

From the documentation:

Свойство Положение находится в середине слоя.

Код, который вы используете, предполагает, что позиция расположена в верхнем левом углу слоя. Вы можете легко это исправить, изменив и из точек:

CGPoint fromPoint = CGPointMake(-layerImg.size.width*0.5, layerImg.size.height*0.5); 
CGPoint toPoint = CGPointMake(layerImg.size.width*1.5, layerImg.size.height*0.5); 

Теперь ваш слой анимации из вне экрана слева закадровый право.

+0

Большое спасибо. :) Я не правильно прочитал документацию позиции. Это сработало. Большое спасибо. :) –

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