3

我正在尝试实现一个 uiview 绘制的图形。有 3 个 UIView 可以为左/右幻灯片设置动画。问题是,我无法取消 UIView 动画。所以我用CALayer替换了UIViews。现在,问题是 CALayer 是否适用于此?像这样在CALayer上画画正常吗?当我操纵框架属性时,为什么 CALayer 这么慢。

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

有替代方案吗?

PS我是德国人。对错误感到抱歉。


我使用 CATransaction 获得了动画,但现在我将使用 CABasicAnimation 为斧头移动设置动画。没问题期望层的位置回到之前的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 属性,但没有效果。

希望得到帮助。

马库斯

4

2 回答 2

1

不确定“慢”是什么意思,但是以这种方式设置 CALayer 的框架使用“隐式动画”。也就是说,它将动画从旧帧到新帧的过渡。您可以将其关闭:

[CATransaction begin];
[CATransaction setValue: (id) kCFBooleanTrue forKey: kCATransactionDisableActions];
[curve setFrame:frame];
[CATransaction commit];

然而,这通常被认为是 CALayer 的一个优势。您只想在这里使用 UIViews,默认情况下,它不会为这样的过渡设置动画。

于 2010-04-08T10:42:42.473 回答
0

无需在动画中设置目标位置,只需设置要移动的事物的位置属性即可。

当您添加Animation:theAnimation 时,您正在设置对您指定的keyPath 属性的任何更改的“视觉样式”。

当您更改动画附加到的对象的位置时,例如从 (0,0) 到 (500,500),CoreAnimation 将为您设置动画。theAnimation 对象不需要开始和结束位置,因为底层对象有它们。

于 2010-09-15T22:31:28.637 回答