public static SkeletonLayerAnimation MakeSlidingAnimation(GradientDirection direction, double duration = 1.5) { return((layer) => { var startValues = direction.StartPoint(); var endValues = direction.EndPoint(); var startPointAnim = CABasicAnimation.FromKeyPath(nameof(CAGradientLayer.StartPoint)); startPointAnim.From = NSValue.FromCGPoint(startValues.from); startPointAnim.To = NSValue.FromCGPoint(startValues.to); var endPointAnim = CABasicAnimation.FromKeyPath(nameof(CAGradientLayer.EndPoint)); endPointAnim.From = NSValue.FromCGPoint(endValues.from); endPointAnim.To = NSValue.FromCGPoint(endValues.to); var animGroup = new CAAnimationGroup { Animations = new[] { startPointAnim, endPointAnim }, Duration = duration, TimingFunction = CAMediaTimingFunction.FromName(CAMediaTimingFunction.EaseIn), RepeatCount = float.MaxValue }; return animGroup; }); }