iOS 3.2上的CATransaction + UIView

时间:2012-07-03 12:03:42

标签: ios animation core-animation catransaction

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

这是我的代码:

[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 = ...) - 它更糟糕,因为视图的子视图没有调整大小。
  • 我将禁用操作选项设置为YES和NO。

解决方案要求:

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

3 个答案:

答案 0 :(得分:1)

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

[CATransaction setDisableActions: YES];

通过拨打该电话,您的交易中所做的所有更改都将立即提交,无需动画。摆脱那条线,变化应该是动画。

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

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

答案 1 :(得分: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];

答案 2 :(得分:0)

如果您只想拥有自定义计时功能,那么您可以使用CABasicAnimation进行此操作。您可以创建自定义计时功能(从(0,0)到(1,1)的贝塞尔曲线,您可以指定两个控制点。

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

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