objective-c - 具有贝塞尔曲线和恒定速度的 CAKeyframeAnimation

标签 objective-c ios core-animation

我正在尝试沿包含一些贝塞尔曲线的 CGPathRef 制作图形动画,我希望动画从开始到结束具有平滑、恒定的速度。不过,我遇到的是每次到达关键点时动画都会缓入缓出。我试过使用不同的 timingFunctioncalculationMode 设置,但我似乎无法找到正确的组合来完成工作。

这是我到目前为止所得到的:

-(void)animate
{
  CAKeyframeAnimation *posAnim = [CAKeyframeAnimation animationWithKeyPath:@"position"];
  posAnim.path = [self pathForAnimation];
  posAnim.duration = 12.0;
  posAnim.calculationMode = kCAAnimationPaced;
  posAnim.fillMode = kCAFillModeBoth;
  posAnim.removedOnCompletion = NO;
  posAnim.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionLinear];
  [image.layer addAnimation:posAnim forKey:@"posAnim"];
}

-(CGPathRef)pathForAnimation
{
  CGMutablePathRef path;
  CGPoint point;
  CGPoint controlPoint1;
  CGPoint controlPoint2;

  path = CGPathCreateMutable();
  point = CGPointMake(209.5f, 24.5f);
  CGPathMoveToPoint(path, NULL, point.x, point.y);

  point = CGPointMake(249.5f, 64.5f);
  controlPoint1 = CGPointMake(232.5f, 25.5f);
  controlPoint2 = CGPointMake(249.5f, 37.5f);
  CGPathAddCurveToPoint(path, NULL, controlPoint1.x, controlPoint1.y, controlPoint2.x, controlPoint2.y, point.x, point.y);

  point = CGPointMake(146.5f, 301.5f);
  controlPoint1 = CGPointMake(249.5f, 91.5f);
  controlPoint2 = CGPointMake(147.5f, 258.5f);
  CGPathAddCurveToPoint(path, NULL, controlPoint1.x, controlPoint1.y, controlPoint2.x, controlPoint2.y, point.x, point.y);

  point = CGPointMake(146.5f, 458.5f);
  controlPoint1 = CGPointMake(145.5f, 344.5f);
  controlPoint2 = CGPointMake(170.5f, 418.5f);
  CGPathAddCurveToPoint(path, NULL, controlPoint1.x, controlPoint1.y, controlPoint2.x, controlPoint2.y, point.x, point.y);

  point = CGPointMake(18.5f, 530.5f);
  controlPoint1 = CGPointMake(122.5f, 498.5f);
  controlPoint2 = CGPointMake(18.5f, 530.5f);
  CGPathAddCurveToPoint(path, NULL, controlPoint1.x, controlPoint1.y, controlPoint2.x, controlPoint2.y, point.x, point.y);

  return path;
}

为了它的值(value),我尝试用直线替换曲线(使用 CGPathAddLineToPoint),这给了我想要的恒定速度。但当然,如果可能的话,我宁愿有曲线。

我也曾尝试用 timingFunctions 数组替换 timingFunction,但无济于事。

最佳答案

您是否尝试过将关键帧动画的 calculationMode 属性设置为 kCAAnimationCubicPaced?该属性专门用于使动画在整个曲线上遵循恒定的速度。

关于objective-c - 具有贝塞尔曲线和恒定速度的 CAKeyframeAnimation,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8139130/

相关文章:

iphone - 一旦 App 进入后台,AVAssetWriter 就会失败

ios - View 在 iphone 4 上看起来不错,但在 iphone 5 上被推低了

ios - 如何为导航 Controller 提供自定义 UIViewControllerAnimatedTransitioning 和使用默认 UIViewControllerInteractiveTransitioning

ios - bool 比较或零比较更快吗?

ios - 如何应用 CAGradientLayer 作为另一个 CALayer 的 mask ?

objective-c - 如何找出字符串中的第一个字符是否是拉丁字母表中的字母

ios - UITableView滚动滞后,即使是简单文本

ios - AVAudioSession - 如何在扬声器和耳机输出之间切换

iphone - UITableViewCell 平移以显示选项 : Animated

cocoa - CoreAnimation 不适用于 QTMovieView 上的 -setAlphaValue