Xcode: 如何在 CATransaction 中做线性动画

Xcode: how to do linear animation in a CATransaction

我的事务开始时很慢,变得很快,然后变慢。 我全程需要线速度。

我找到了 UIViewAnimationOptionCurveLinear 但找不到 [CATransaction begin]

的示例

这是我的代码:

[ CATransaction begin ]; 
    if( graph_animation_enable )
        [CATransaction setAnimationDuration: graph_animation_seconds ];
    else
        [CATransaction setAnimationDuration: 0 ];

    //[CATransaction setValue : ( id ) kCFBooleanTrue forKey : kCATransactionDisableActions]; 
    graph_CALayer.frame = CGRectMake( left_x, top_y, width, height );
    graph_CALayer.backgroundColor = bar_background_color.CGColor;

    CAMediaTimingFunction *linearTiming = 
      [CAMediaTimingFunction functionWithName: kCAMediaTimingFunctionLinear];
    [CATransaction setAnimationTimingFunction: linearTiming];

[CATransaction commit];

我尝试了答案,但仍然是非线性的。 动画开始,但随后变慢。

使用CATransactionsetAnimationTimingFunctionkCAMediaTimingFunctionLinear

的计时值

代码如下所示:

CAMediaTimingFunction *linearTiming = 
  [CAMediaTimingFunction functionWithName: kCAMediaTimingFunctionLinear];
[CATransaction setAnimationTimingFunction: linearTiming]

对于Swift5,CATransaction有一个方法叫做setAnimationTimingFunction(_:)setAnimationTimingFunction(_:) 具有以下声明:

class func setAnimationTimingFunction(_ function: CAMediaTimingFunction?)

Sets the timing function used for all animations within this transaction group. [...] This is a convenience method that sets the CAMediaTimingFunction for the value(forKey:) value of the kCATransactionAnimationTimingFunction key.


因此,您可以使用以下代码片段之一为您的 CATransaction 设置线性动画:

CATransaction.begin()
CATransaction.setAnimationTimingFunction(CAMediaTimingFunction(name: CAMediaTimingFunctionName.linear))
/* ... */
CATransaction.commit()
CATransaction.begin()
CATransaction.setValue(CAMediaTimingFunction(name: CAMediaTimingFunctionName.linear), forKey: kCATransactionAnimationTimingFunction)
/* ... */
CATransaction.commit()