每次使用核心动画我都会遇到麻烦!有人能帮我解决这个bug吗?它已经让我忙了好几个小时了。
我正在设置层的边界和位置的动画。要真正更改模型层,而不仅仅是表示层值。
我的代码创建了一个新的CALayer
-对象,然后将其位置从a设置为B,持续1s这很管用
稍后,我使用相同的代码片段将层移回其原始位置(A),持续时间再次为1s。这是不起作用的!层确实向后移动,但由于指定位置并绑定到其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秒内移动层。我的问题是:我的代码或方法出了什么问题?
我想说,这种方法有点奇怪。这看起来像是一个自动反转的动画,可以通过CABasicAnimation
的autoreverses
属性简单地实现。也可以在UIView
上尝试关键帧动画和animateWithDuration:
功能。