无法在 Xamarin.iOS 中为微光设置渐变图层动画

Unable to animate gradient layer for shimmer in Xamarin.iOS

无法使用 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")

问题似乎是您为动画传递给 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 库,因此大小写必须与 属性 在那里的命名方式相匹配。

如果这不能解决您的问题,您需要提供更多信息,说明您的 C# 代码中的 shimmerView 和 Swift 代码中的 self 是什么以及调用这些代码片段的上下文。