使用UIView或CALayer进行绘制和动画?

3

我正在尝试实现一个由UIView绘制的图形。有3个UIView用于动画左/右滑动。问题是,我无法取消UIView动画。因此,我用CALayer替换了UIView。现在的问题是,是否适用于CALayer?像这样在CALayer上绘制正常吗?为什么当我操作frame属性时,CALayer会变得如此缓慢。

CGRect frame = curve.frame;
frame.origin.x -= diffX;
[curve setFrame:frame];

有没有其他的替代方案?

附言:我是一名德国人。对于错误我很抱歉。


我使用CATransaction得到了动画效果,但现在我想用CABasicAnimation来实现x轴移动的动画效果。这并不是问题,只是图层的位置会回到之前的x轴位置。

CABasicAnimation *theAnimation; 
theAnimation = [CABasicAnimation animationWithKeyPath:@"position"]; 
theAnimation.delegate = self;
theAnimation.duration = 1.0;
theAnimation.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseOut];
CGPoint position = [[curves objectAtIndex:i]position];
position.x = [[curves objectAtIndex:i]position].x - diffX;
[theAnimation setToValue:[NSValue valueWithCGPoint:position]];
[[curves objectAtIndex:i] addAnimation:theAnimation forKey:[NSString stringWithFormat: @"translate.x.%d", index]];

该位置更改了位置(例如xStart = 100,xEnd = 200),但当动画结束时,图层返回到开始的x位置(例如x = 100)。 这是正常的吗?如何解决这个问题,使结束位置不再改变? 我尝试更改removeOnComplete属性,但没有效果。
希望得到帮助。
马尔库斯
2个回答

1
不确定您所说的“慢”是什么意思,但以这种方式设置CALayer的帧会使用“隐式动画”。也就是说,它将从旧框架过渡到新框架进行动画处理。您可以关闭此功能:
[CATransaction begin];
[CATransaction setValue: (id) kCFBooleanTrue forKey: kCATransactionDisableActions];
[curve setFrame:frame];
[CATransaction commit];

然而,这通常被认为是CALayer的一个优点。您可能希望在此处仅使用UIView,这样默认情况下不会动画过渡。


0

不要在动画中设置目标位置,而是直接设置你想移动的物体的位置属性。

当你使用addAnimation:theAnimation时,你正在设置所指定keyPath属性的任何更改的“视觉样式”。

当你改变动画附着对象的位置,比如从(0,0)到(500,500),CoreAnimation会自动为你执行动画。theAnimation对象不需要起始和结束位置,因为底层对象已经有了这些信息。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接