如何在翻译过程中使用一组图像(即在img1和img2之间切换)更改myLayer.contents?谢谢!
UIImage *myImage = [UIImage imageNamed:@"img1.png"];
CALayer *myLayer = [CALayer layer];
myLayer.contents = (id)myImage.CGImage;
myLayer.Position = CGPointMake(0,0);
myLayer.Bounds=CGRectMake(0.0, 0.0, 50, 50);
[self.view.layer addSublayer:myLayer];
//translation1
CGPoint startPt = CGPointMake(10,10);
CGPoint endPt = CGPointMake(100,100);
CABasicAnimation *transl1 = [CABasicAnimation animationWithKeyPath:@"position"];
transl1.removedOnCompletion = FALSE;
transl1.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionLinear];
transl1.fromValue = [NSValue valueWithCGPoint:startPt];
transl1.toValue = [NSValue valueWithCGPoint:endPt];
transl1.duration = 3;
transl1.fillMode = kCAFillModeForwards;
transl1.beginTime = 0;
[myLayer addAnimation: transl1 forKey: nil];
答案 0 :(得分:2)
行走的人示例:
我已经处理了完全相同的任务,但我必须做一个跑步的蜘蛛,它是6条腿走路,有12帧。 这实际上很难做,并花了我几个月的时间来完善。 事实是醒来的人通常是通过将一组图像帧(第一条腿,最后一条腿)设置为UIImageView的animationImages属性来完成的。 然后你将动画打开和关闭,同时左右移动角色,这样就形成了一种行走的幻觉。 现在,当你想要创造一种加速幻觉时,就会出现一个大问题。动画播放期间无法改变动画持续时间,这是一个很难克服的重大挫折。
以下是我为解决此问题而制作的代码:
在这里,您可以定义一个带有步行腿框架的数组,每步框架。
animationImagesSpider = [NSArray arrayWithObjects:
[UIImage imageNamed:@"1@2x.png"], [UIImage imageNamed:@"2@2x.png"], [UIImage imageNamed:@"3@2x.png"], [UIImage imageNamed:@"4@2x.png"], [UIImage imageNamed:@"5@2x.png"], [UIImage imageNamed:@"6@2x.png"], [UIImage imageNamed:@"6@2x.png"], [UIImage imageNamed:@"8@2x.png"], [UIImage imageNamed:@"9@2x.png"], [UIImage imageNamed:@"10@2x.png"], [UIImage imageNamed:@"11@2x.png"], [UIImage imageNamed:@"1@2x.png"], nil];
这里将数组附加到UIImageView:
imgViewSpider = [[UIImageView alloc] initWithFrame:CGRectMake(200,410,100,145)];
imgViewSpider.animationImages = animationImagesSpider;
现在如果你只是调用[imgViewSpider startAnimating];这将以恒定速度启动动画,直到你停止它。为了解决这个问题,我使用了一个递归,为每个步骤播放一个短动画,这允许调整每个步骤之间的持续时间:
- (void) spiderRun {
imgViewSpider.animationDuration= 0.51-(accSp/3.5);
[imgViewSpider setAnimationRepeatCount:222]; /// this is a dummy value that has no effect because animtion ends after the first frame
[imgViewSpider startAnimating];
[self performSelector:@selector(spiderRun) withObject:nil afterDelay: 0.5-(accSp/3.5)];
}
通过不断更改accSp值,我可以控制步行期间的步行速度。
答案 1 :(得分:1)
正如另一张海报所说,创建第二个动画,将图层的内容属性设置为新图像。
我建议将两个动画放入动画组,然后将动画组添加到图层。然后,您可以轻松控制两个动画的持续时间和开始时间。你可以让图像交换发生在总持续时间的一部分上,定时发生在动画的中间。
您可以使用beginTime属性设置动画的开头,使用duration属性设置持续时间。
答案 2 :(得分:0)
您需要创建第二个动画transl2,此动画将使图像交换。您需要将持续时间设置为transl1持续时间的一半,以便它将落在transl1动画的中间。
transl1.duration = 3
transl2.duration = 1.5