使用 UIView 或 CALayer 绘制和动画?
Posted
技术标签:
【中文标题】使用 UIView 或 CALayer 绘制和动画?【英文标题】:Drawing and Animating with UIView or CALayer? 【发布时间】:2010-04-08 10:20:35 【问题描述】:我正在尝试实现一个 uiview 绘制的图形。有 3 个 UIView 可以为左/右幻灯片设置动画。问题是,我无法取消 UIView 动画。所以我用CALayer替换了UIViews。现在,问题是 CALayer 是否适用于此?像这样在CALayer上画画正常吗?以及为什么在我操作框架属性时 CALayer 会这么慢。
CGRect frame = curve.frame;
frame.origin.x -= diffX;
[curve setFrame:frame];
有其他选择吗?
附:我是一个德国人。有错误请见谅。
我使用 CATransaction 获得动画,但现在我将使用 CABasicAnimation 为 x 移动设置动画。期望layer的位置回到之前的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 属性,但没有效果。
希望得到帮助。
马库斯
【问题讨论】:
【参考方案1】:不确定“慢”是什么意思,但以这种方式设置 CALayer 的框架使用“隐式动画”。也就是说,它将动画从旧帧到新帧的过渡。您可以将其关闭:
[CATransaction begin];
[CATransaction setValue: (id) kCFBooleanTrue forKey: kCATransactionDisableActions];
[curve setFrame:frame];
[CATransaction commit];
然而,这通常被认为是 CALayer 的一个优势。你想在这里只使用 UIViews,默认情况下,它不会为这样的过渡设置动画。
【讨论】:
【参考方案2】:不用在动画中设置目标位置,只需设置要移动的东西的位置属性即可。
当您添加Animation:theAnimation 时,您正在为您指定的keyPath 属性设置任何更改的“视觉样式”。
当您更改动画附加到的对象的位置时,例如从 (0,0) 到 (500,500),CoreAnimation 将为您设置动画。 theAnimation 对象不需要开始和结束位置,因为底层对象有它们。
【讨论】:
以上是关于使用 UIView 或 CALayer 绘制和动画?的主要内容,如果未能解决你的问题,请参考以下文章
iOS动画:UIView动画和CALayer动画(CABasicAnimationCAKeyframeAnimation的使用)