2014-12-05 4 views
0

У меня очень странная проблема, пытаясь анимировать форму треугольника по дуге окружности, от -π/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π, время будет правильным. Что может вызвать эту проблему?

Код C# с Xamarin.iOS, но код Objective C/Swift будет аналогичным.

Edit:

я узнал, что это работает, если я создаю UIBezierPath дугу от 0 - его, а затем поверните его им/2. Поэтому я подозреваю, что есть что-то рыбное с Xamarin.iOS и UIBezierPath с отрицательными углами.

+0

Почему вы используете 'CAKeyFrameAnimation'? – Andy

+0

Это тип анимации, который я мог бы найти, чтобы позволить мне анимировать слой по определенному пути. – NilsH

+0

Я не вижу в вашем коде анимации ключевого кадра. Если вы не используете ключевые кадры, вы должны прибегнуть к 'CABasicAnimation', который анимируется от точки A до B, от PathA до PathB и т. Д. – Andy

ответ

1

Я сделал быстрое прототип приложения, чтобы проверить это. Для простоты я использовал изображение вместо слоя формы. Вот результат:

  • Анимационный от -M_PI_2 до 3 * M_PI_2 работ, как ожидается
  • Там нет необходимости добавлять невидимый слой (просто использовать path вы создали)

Это приводит меня к мысли, что, возможно, ваша проблема похожа на Xamarin.iOS. Были некоторые причуды с типом CGFloat, поэтому, возможно, если бы вы могли явно использовать аргументы, это могло бы помочь.

+0

Спасибо, я попробую. – NilsH

+0

Странная вещь, у меня есть другая дуга, которую я анимация с 'strokeStart' и' strokeEnd', с той же продолжительностью, и эта анимация следует дуге и длительности отлично. – NilsH

+0

И даже незнакомец, устанавливая дугу против часовой стрелки, с тем же углом начала и конца, также имеет правильное время ... – NilsH