Невозможно анимировать градиентный слой для мерцания в Xamarin.iOS - PullRequest
0 голосов
/ 07 июля 2019

Невозможно анимировать градиентный слой с помощью CABasicAnimation для мерцания.

CAGradientLayer gradientLayer = new CAGradientLayer();
gradientLayer.Colors = new CGColor[] { UIColor.Black.CGColor, UIColor.White.ColorWithAlpha(0.1F).CGColor, UIColor.Black.CGColor };
gradientLayer.StartPoint = new CGPoint(0, 0.5);
gradientLayer.EndPoint = new CGPoint(1.0, 0.525);
gradientLayer.Locations = new NSNumber[] { 0.4, 0.5, 0.6 };
gradientLayer.Frame = new CGRect(- shimmerView.Frame.Width, 0, 3 * shimmerView.Frame.Width, shimmerView.Frame.Height);

shimmerView.Layer.Mask = gradientLayer;

CABasicAnimation anmtn = new CABasicAnimation();
anmtn.KeyPath = "TransGrad";
anmtn.From = NSArray.FromObjects(new NSNumber[] { 0.0, 0.1, 0.2 });
anmtn.To = NSArray.FromObjects(new NSNumber[] { 0.8, 0.9, 1.0 });
anmtn.Duration = 2;
anmtn.RepeatCount = 1000;
gradientLayer.AddAnimation(animation, "loc");

Я могу анимировать, используя ту же логику в swift.Пожалуйста, предоставьте свои ответы для Xamarin.iOS.

Swift

let light = UIColor.white.withAlphaComponent(0.1)
let dark = UIColor.black.cgColor
let gradient: CAGradientLayer = CAGradientLayer()
gradient.colors = [dark, light, dark]
gradient.frame = CGRect(x: -self.bounds.size.width, y: 0, width: 3 * self.bounds.size.width, height: self.bounds.size.height)
gradient.startPoint = CGPoint(x: 0.0, y: 0.5)
gradient.endPoint = CGPoint(x: 1.0, y: 0.525)
gradient.locations = [0.4, 0.5, 0.6]
self.layer.mask = gradient

let animation: CABasicAnimation = CABasicAnimation(keyPath: "locations")
animation.fromValue = [0.0, 0.1, 0.2]
animation.toValue = [0.8, 0.9, 1.0]

animation.duration = 1.5
animation.repeatCount = HUGE
gradient.add(animation, forKey: "shimmer")

1 Ответ

0 голосов
/ 07 июля 2019

Кажется, что проблема заключается в значении, которое вы передаете KeyPath для вашей анимации.CAGradientLayer не имеет свойства TransGrad, поэтому попытка добавить анимацию с помощью KeyPath не будет работать.

Если вы просто оставите тот же путь ключа из версии Swift, анимация должна вести себя так же:

CAGradientLayer gradientLayer = new CAGradientLayer();
gradientLayer.Colors = new CGColor[] { UIColor.Black.CGColor, UIColor.White.ColorWithAlpha(0.1F).CGColor, UIColor.Black.CGColor };
gradientLayer.StartPoint = new CGPoint(0, 0.5);
gradientLayer.EndPoint = new CGPoint(1.0, 0.525);
gradientLayer.Locations = new NSNumber[] { 0.4, 0.5, 0.6 };
gradientLayer.Frame = new CGRect(- shimmerView.Frame.Width, 0, 3 * shimmerView.Frame.Width, shimmerView.Frame.Height);

shimmerView.Layer.Mask = gradientLayer;

CABasicAnimation anmtn = new CABasicAnimation();
anmtn.KeyPath = "locations";
anmtn.From = NSArray.FromObjects(new NSNumber[] { 0.0, 0.1, 0.2 });
anmtn.To = NSArray.FromObjects(new NSNumber[] { 0.8, 0.9, 1.0 });
anmtn.Duration = 2;
anmtn.RepeatCount = 1000;
gradientLayer.AddAnimation(anmtn, "shimmer");

Обратите внимание, что это "locations", а не "Locations", поскольку это значение в конечном итоге передается родным библиотекам iOS, поэтому регистр должен совпадать с тем, как имя свойства там указано.

Если этоне решит вашу проблему, вам нужно будет предоставить больше информации о том, что shimmerView в вашем коде C # и self в вашем коде Swift и контекстах, которые называются эти фрагменты кода.

...