【问题标题】:CATransaction + UIView on iOS 3.2iOS 3.2 上的 CATransaction + UIView
【发布时间】:2012-07-04 10:08:43
【问题描述】:

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

解决方案要求:

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

【问题讨论】:

    标签: ios animation core-animation catransaction


    【解决方案1】:

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

    [CATransaction setDisableActions: YES];
    

    通过调用,您的事务中所做的所有更改都将立即提交,无需动画。去掉那条线,变化就会有动画效果。

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

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

    【讨论】:

      【解决方案2】:

      不确定这是否是您想要的,但您可以使用 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];
      

      【讨论】:

      • 动画曲线太难了,不能用UIView动画方法。我已经更新了问题并添加了 MediaTimingFunction 的要求。
      【解决方案3】:

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

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

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

      【讨论】:

      • 是的,我考虑过使用 BasicAnimation,但据我了解,它只应用于一层。我应该为多个视图设置动画。
      • 您可以使用动画组将多个动画应用到同一层,但如果您想将它们应用到不同的层,则需要一个事务。动画组的好处是您可以配置它们(例如设置时间),它将应用于该组中的所有动画。但是,如果您需要关键帧动画,它就不会那么好了。也许你可以有一个方法为你的“to”和“from”值返回合适的数组,并使用它为所有动画获取相同的时间(如果你需要关键帧)
      猜你喜欢
      • 2011-03-30
      • 1970-01-01
      • 1970-01-01
      • 2011-07-30
      • 2017-02-11
      • 1970-01-01
      • 2014-07-06
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多