1

每次我使用核心动画我都会遇到麻烦!有人可以帮我解决这个错误吗?它让我忙了好几个小时。

我正在为图层的边界和位置设置动画。要真正改变模型层,而不仅仅是表示层,我了解到应该在开始动画之前设置位置并绑定到它们的最终toValues 。

我的代码创建了一个新的-object CALayer,然后在 1 秒内将其位置从A设置为B。这很好用!

稍后,我使用相同的代码片段将图层移回其原始位置 (A),持续时间为 1 秒。这不起作用!该层确实向后移动,但由于分配位置并绑定到它们的 toValues 的代码行引起的默认动画,它发生得非常

我真的很想了解我的代码有什么问题!错字吗?还是我(再次)误解了核心动画?

这是我的代码。第一种方法创建一个新CALayer对象并将其添加到超层。

-(CALayer*) addLayerFromIm:(UIImage*) im{

    CALayer *lay = [CALayer layer];
    lay.bounds = CGRectMake(0,0, 100,100); // default values never used
    lay.position = CGPointMake(0,0);
    lay.contents = (id) im.CGImage;
    lay.zPosition = 0;
    [self.layer addSublayer:lay];
    return lay;  }

下面的方法将动画添加到层,它还改变了它的位置和边界属性。

-(CALayer*) animateLayer:(CALayer*) lay fromRect:(CGRect)rcFrom toRect:(CGRect)rcTo duration:(float) duration{

    [lay removeAllAnimations];

    lay.position  = rcTo.origin;
    lay.bounds    = CGRectMake( 0,0, rcTo.size.width,rcTo.size.height);

    CABasicAnimation* animP = [CABasicAnimation animationWithKeyPath:@"position"];
    animP.fromValue =[NSValue  valueWithCGPoint:rcFrom.origin];
    animP.toValue =  [NSValue  valueWithCGPoint:rcTo.origin];
    animP.fillMode =  kCAFillModeForwards; 
    animP.duration = duration;
    animP.beginTime = CACurrentMediaTime();
    animP.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionLinear];
    animP.removedOnCompletion = YES;
    [lay addAnimation:animP forKey:nil]; 


    CABasicAnimation* animB = [CABasicAnimation animationWithKeyPath:@"bounds"];
    animB.fromValue = [NSValue valueWithCGRect:CGRectMake(0, 0, rcFrom.size.width, rcFrom.size.height)];
    animB.toValue   = [NSValue valueWithCGRect:CGRectMake(0, 0, rcTo.size.width, rcTo.size.height)];
    animB.fillMode = kCAFillModeForwards;
    animB.duration = duration;
    animB.beginTime = CACurrentMediaTime();
    animB.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionLinear];
    animB.removedOnCompletion = YES;

    [lay addAnimation:animB forKey:nil];

    return lay; }

这是图层的创建和动画方式(效果很好)

UIImage* imDst = [UIImage imageNamed:@"connectionDst.png"]; 

CALayer *lay = [self animateLayer:[self addLayerFromIm:imDst] fromRect:rcA toRect:rcB duration:1.0];

稍后,我尝试将图层移回 A。

[self animateLayer:lay fromRect:rcB toRect:rcA duration:1.0];

但随后会启动默认动画并在 0.2 秒内移动图层。我的问题是:我的代码或方法有什么问题?

4

1 回答 1

0

我会说,这种方法有点奇怪。这看起来像一个自动反转的动画,可以简单地autoreverses通过CABasicAnimation. 或者你可以尝试关键帧动画和animateWithDuration:功能UIView

于 2015-09-06T02:26:29.823 回答