0

我需要在 iOS 3.2 上实现非常自定义的动画所以,在 4.0 之前我既不能使用块动画也不能使用 UIKit 动画。我尝试使用核心动画。

这是我的代码:

[CATransaction begin];
[CATransaction setAnimationDuration: 3.0];
[CATransaction setDisableActions: YES];
someView.frame = CGRectMake(endX, 0, endWidth, height); 
// a lot of another property changes
[CATransaction commit];

不幸的是,它不起作用:视图立即改变大小/不透明度,没有任何动画。

这是我的尝试:

  • 我将新框架设置为不是查看而是设置到其层(someView.layer.frame = ...) - 更糟糕的是,因为视图的子视图没有调整大小。
  • 我将禁用操作选项设置为是和否。

解决方案要求:

  • 必须支持 iOS 3.2(无块)。
  • 动画必须应用于不同的视图(因此,应用于不同的层)。
  • 动画曲线已经够难了,所以我不能使用预定义的动画曲线(或者,通过 CA 语言,MediaTimingFunction)。
4

3 回答 3

1

您发布的代码明确禁用动画。这条线是罪魁祸首:

[CATransaction setDisableActions: YES];

通过进行该调用,您的事务中所做的所有更改都将立即提交,而无需动画。摆脱那条线,变化应该是动画的。

如果您需要自定义曲线,您可能想要使用 CABasicAnimation,正如其他人所建议的那样。事实上,CAAnimation 对象仅适用于单个图层,因此您必须创建多个 CAAnimation 对象。

或者,您应该能够使用 CATransaction 方法 setAnimationTimingFunction,并将您创建的自定义计时函数传递给它。请参阅 CAMediaTimingFunction 类参考。具体看一下 functionWithControlPoints:::: 方法,它允许您通过指定描述计时函数的贝塞尔曲线的控制点来创建计时函数。您只能使用从 0,0 开始到 1,1 结束的单个三次贝塞尔曲线。没有直接支持更复杂的计时功能,尽管我已经看到了实现更复杂效果的 hack。

于 2012-07-04T02:08:43.920 回答
0

如果您只想拥有一个自定义计时功能,那么您可以使用 CABasicAnimation 来实现。您可以创建自定义计时函数(它是从 (0,0) 到 (1,1) 的贝塞尔曲线,其中包含您可以指定的两个控制点。

如果这对您来说还不够(如果您的计时功能需要 2 个以上的控制点),那么您将不得不使用 CAKeyframeAnumation。然后,您可以指定任意数量的值(使用values属性(数组)。

在这两种情况下,您都将为关键路径“帧”创建一个动画对象并将动画添加到视图层。请注意,明确地为属性设置动画不会更改值,因此在动画之后帧将返回其原始值,除非您同时设置动画更改值

于 2012-07-03T12:31:18.277 回答
0

不确定这是否是您想要的,但您可以使用 UIView 动画

[UIView beginAnimations:nil context:nil];
[UIView setAnimationDuration:3.0];
someView.frame = CGRectMake(endX, 0, endWidth, height); 
// a lot of another property changes
[UIView commitAnimations];
于 2012-07-03T12:05:51.090 回答