我正在尝试在CAShapeLayer上设置CGColor fillColor属性的动画。我可以使用Objective-C使用以下语法使其正常工作:
- (void)viewDidLoad {
[super viewDidLoad];
// Create the path
thisPath = CGPathCreateMutable();
CGPathMoveToPoint(thisPath, NULL, 100.0f, 50.0f);
CGPathAddLineToPoint(thisPath, NULL, 10.0f, 140.0f);
CGPathAddLineToPoint(thisPath, NULL, 180.0f, 140.0f);
CGPathCloseSubpath(thisPath);
// Create shape layer
shapeLayer = [CAShapeLayer layer];
shapeLayer.frame = self.view.bounds;
shapeLayer.path = thisPath;
shapeLayer.fillColor = [UIColor redColor].CGColor;
[self.view.layer addSublayer:shapeLayer];
// Add the animation
CABasicAnimation* colorAnimation = [CABasicAnimation animationWithKeyPath:@"fillColor"];
colorAnimation.duration = 4.0;
colorAnimation.repeatCount = 1e100f;
colorAnimation.autoreverses = YES;
colorAnimation.fromValue = (id) [UIColor redColor].CGColor;
colorAnimation.toValue = (id) [UIColor blueColor].CGColor;
[shapeLayer addAnimation:colorAnimation forKey:@"animateColor"];
}
这会按预期设置颜色偏移。当我把它移植到Monotouch时,我尝试了:
public override void ViewDidLoad ()
{
base.ViewDidLoad ();
thisPath = new CGPath();
thisPath.MoveToPoint(100,50);
thisPath.AddLineToPoint(10,140);
thisPath.AddLineToPoint(180,140);
thisPath.CloseSubpath();
shapeLayer = new CAShapeLayer();
shapeLayer.Path = thisPath;
shapeLayer.FillColor = UIColor.Red.CGColor;
View.Layer.AddSublayer(shapeLayer);
CABasicAnimation colorAnimation = CABasicAnimation.FromKeyPath("fillColor");
colorAnimation.Duration = 4;
colorAnimation.RepeatCount = float.PositiveInfinity;
colorAnimation.AutoReverses = true;
colorAnimation.From = NSObject.FromObject(UIColor.Red.CGColor);
colorAnimation.To = NSObject.FromObject(UIColor.Blue.CGColor);
shapeLayer.AddAnimation(colorAnimation, "animateColor");
}
但动画永远不会播放。 animationStarted事件确实被提升,因此可能是它试图运行动画,但我没有在屏幕上看到任何可见的证据。
我在一天中的大部分时间都在使用它,我认为这是从CGColor转换为NSObject - 我已经尝试过NSObject.FromObject,NSValue.ValueFromHandle等,但还没有找到任何让动画正确拾取开始和结束值的方法。
为动画提供CGColor作为NSObject的正确方法是什么?
谢谢!
答案 0 :(得分:9)
标记,
您可以使用
colorAnimation.To = Runtime.GetNSObject (UIColor.Blue.CGColor.Handle);
获取动画的正确对象。
感谢https://stackoverflow.com/users/187720/geoff-norton实际上给了我使用Runtime.GetNSObject的答案并解决了这个问题。
希望这有帮助,
ChrisNTR
答案 1 :(得分:3)
也可以这样做:
colorAnimation.From = NSObject.FromObject (UIColor.Red.CGColor.Handle);
以及MonoTouch的下一个版本(6.0.8+)将允许:
colorAnimation.From = NSObject.FromObject (UIColor.Red.CGColor);
以及非CGPath
的{{1}}和其他INativeObject
的内容相同。
答案 2 :(得分:0)
我刚刚查看了一些在我们的应用中编写的类似代码(诚然为CAKeyFrameAnimation
而不是CABasicAnimation
),他们似乎已将.AddAnimation()
包装在UIView动画块中。 E.g:
UIView.Animate(4, delegate{
shapeLayer.AddAnimation(colorAnimation, "animateColor");
});
我不确定这是否是正确的方法,但它似乎在我们的应用程序中工作。