沿弧形的动画的可见持续时间和实际持续时间是不同的

时间:2014-12-05 12:43:05

标签: ios objective-c swift xamarin.ios xamarin

我有一个非常奇怪的问题,试图沿圆弧动画三角形,从-π/ 2到2π-π/ 2(从垂直位置开始)。像这样:

   // Construct the invisible animation path
   var path = UIBezierPath.FromArc(new PointF(rect.GetMidX(), rect.GetMidY()), (rect.Height - 20) / 2, (float)(- Math.PI / 2), (float)(2*Math.PI - Math.PI / 2), true);
   var pathLayer = new CAShapeLayer();
   pathLayer.Frame = rect;
   pathLayer.Path = path.CGPath;
   pathLayer.FillColor = UIColor.Clear.CGColor;
   pathLayer.StrokeColor = UIColor.Clear.CGColor;
   view.AddSublayer(pathLayer); // It appears that I need to create and add a layer to be able to animate along the path?

   // Create the shape to animate
   var triangleLayer = new CAShapeLayer();
   var triangle = CreateTriangle();
   triangleLayer.Frame = triangle.Bounds;
   triangleLayer.Path = triangle.CGPath;
   triangleLayer.StrokeColor = UIColor.Orange.CGColor;
   triangleLayer.FillColor = UIColor.Red.CGColor;
   var triangleAnim = CAKeyFrameAnimation.GetFromKeyPath("position");
   triangleAnim.Path = path.CGPath;
   triangleAnim.Duration = 60;
   triangleAnim.RotationMode = CAKeyFrameAnimation.RotateModeAuto;
   triangleAnim.RemovedOnCompletion = false;

   triangleLayer.AddAnimation(triangleAnim, "progress");
   view.AddSublayer(triangleLayer);

整轮应该需要60秒,但是它会在大约45秒内完成,然后在15秒内完成任何操作,然后完成动画。因此动画似乎需要60秒,但视觉动画只需45秒。奇怪的是,如果我将弧从0更改为2π,则时间是正确的。什么可能导致这个问题?

代码是带有Xamarin.iOS的C#,但Objective C / Swift代码类似。

编辑:

我发现如果我从0 - 2π创建一个UIBezierPath弧然后用-π/ 2旋转它,它就可以工作。所以我怀疑Xamarin.iOS和UIBezierPath有负角度可能会发生一些可疑的事情。

1 个答案:

答案 0 :(得分:2)

我制作了一个快速原型应用程序来测试它。为简单起见,我使用的是图像而不是形状图层。结果如下:

  • -M_PI_23 * M_PI_2的动画效果符合预期
  • 无需添加不可见图层(只需使用您创建的path

这让我相信也许你的问题埋没在Xamarin.iOS中。有一些CGFloat类型的怪癖,所以也许你可以明确地转换参数,这可能会有所帮助。