CABasicAnimation появляется за кадром с некоторым отрывом

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

[[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 секунд (предполагается, что она незначительна), для отображения анимации требуется целая вечность. Кажется, что положение за кадром больше, чем то, что я дал. Изображение, которое я использую для слоя, имеет размер 728 на 368.


person Abhinav Singh    schedule 26.01.2016    source источник


Ответы (1)


Из документации:

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

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

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);

Теперь ваш слой будет анимироваться слева направо за пределами экрана.

person Hamish    schedule 26.01.2016
comment
Большое спасибо. :) Я не прочитал должным образом документацию по позиции. Это сработало. Большое спасибо. :) - person Abhinav Singh; 27.01.2016