Как мне преобразовать CGColor в NSObject при использовании Monotouch? - PullRequest
3 голосов
/ 28 апреля 2011

Я пытаюсь анимировать свойство fillColor CGColor на CAShapeLayer.Я могу заставить его работать нормально, используя 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 в качестве объекта NSO для анимации?

Спасибо!

Ответы [ 3 ]

9 голосов
/ 29 апреля 2011

Марк,

Вы можете использовать

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

, чтобы получить нужный объект для анимации.

Престижность https://stackoverflow.com/users/187720/geoff-norton за фактическую передачуответ использовать Runtime.GetNSObject и исправить эту проблему.

Надеюсь, это поможет,

ChrisNTR

3 голосов
/ 16 ноября 2012

Также возможно сделать:

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

и следующие версии MonoTouch (6.0.8+) позволят:

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

и то же самое для CGPath и других INativeObject, которые не NSObject.

0 голосов
/ 28 апреля 2011

Я только что посмотрел на похожий код, написанный в нашем приложении (по общему признанию CAKeyFrameAnimation, а не CABasicAnimation), и они, кажется, заключили .AddAnimation() в блок анимации UIView. Например:

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

Я не уверен, что это правильный способ сделать это, но, похоже, он работает в нашем приложении.

...