CABasicAnimation 以一定距离出现在屏幕外
CABasicAnimation appears offscreen by some margin
所以我第一次尝试 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 x 368。
The position property is located in the middle of the layer.
您使用的代码假定位置位于图层的左上角。您可以通过更改往返点轻松解决此问题:
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);
现在您的图层将从 off-screen 左到 off-screen 右动画。
所以我第一次尝试 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 x 368。
The position property is located in the middle of the layer.
您使用的代码假定位置位于图层的左上角。您可以通过更改往返点轻松解决此问题:
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);
现在您的图层将从 off-screen 左到 off-screen 右动画。