使用 Monotouch 时如何将 CGColor 转换为 NSObject?

Posted

技术标签:

【中文标题】使用 Monotouch 时如何将 CGColor 转换为 NSObject?【英文标题】:How do I convert a CGColor into an NSObject when using Monotouch? 【发布时间】:2011-04-28 15:36:18 【问题描述】:

我正在尝试为 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 的正确方法是什么?

谢谢!

【问题讨论】:

【参考方案1】:

标记,

你可以使用

colorAnimation.To = Runtime.GetNSObject (UIColor.Blue.CGColor.Handle);

为动画获取正确的对象。

感谢https://***.com/users/187720/geoff-norton 为我提供了使用 Runtime.GetNSObject 并解决此问题的答案。

希望对你有帮助,

ChrisNTR

【讨论】:

太棒了!这适用于我的简单示例,不适用于我的完整应用程序,但至少现在我知道它可以为颜色设置动画!谢谢【参考方案2】:

也可以这样做:

colorAnimation.From = NSObject.FromObject (UIColor.Red.CGColor.Handle);

MonoTouch 的下一个版本(6.0.8+)将允许:

colorAnimation.From = NSObject.FromObject (UIColor.Red.CGColor);

对于CGPath 和其他不是NSObjectINativeObject 也是如此。

【讨论】:

【参考方案3】:

我刚刚查看了在我们的应用程序中编写的一些类似代码(诚然是CAKeyFrameAnimation 而不是CABasicAnimation),它们似乎已经将.AddAnimation() 包装在了一个UIView 动画块中。例如:

UIView.Animate(4, delegate
    shapeLayer.AddAnimation(colorAnimation, "animateColor");
);

我不确定这是否是正确的做法,但它似乎适用于我们的应用程序。

【讨论】:

以上是关于使用 Monotouch 时如何将 CGColor 转换为 NSObject?的主要内容,如果未能解决你的问题,请参考以下文章

Monotouch:如何将 UIView 添加到 DialogViewController

如何在应用程序运行时使用 MonoTouch 播放背景音乐

如何使用 EventKit (Calendar) 集成并仍然支持 iOS 3.x (MonoTouch)?

应用程序运行时如何使用MonoTouch播放背景音乐

如何将 Monotouch 对话框添加到 FlyoutNaviagtionController

如何使用 MonoTouch 以短时间格式将 DateTime 格式化为本地用户区域设置