Xamarin - 使用 CoreGraphics.CGAffineTransform 进行旋转

Xamarin - Make rotations with CoreGraphics.CGAffineTransform

我想在下载内容时让 UI 图片旋转,但我似乎无法让它旋转。

我有这个活动:

public override void ViewDidAppear(bool animated)
{
    NoConnectionView.Hidden = CheckConnectivityStatus();
    Task.Run(async () => await StartSpinningAnimation(true));
}

然后触发此方法:

protected async Task StartSpinningAnimation(bool IsSpinning) 
{
    do
    {
        UpdateActiveImage.Transform = CoreGraphics.CGAffineTransform.MakeRotation((float)Math.PI / 4);
    }
    while (IsSpinning);
    return;
}

页面最终会在文件下载后发生变化,所以我只希望它永远旋转。它确实具有动画效果。有人有什么想法吗?

使用 C# 和 Xamarin.iOS 开发 iOS 与本地语言有点不同,每当你想在后台线程中调用一些 UI 元素时(比如你需要做一些 UI 做一个动画),你必须使用:

InvokeOnMainThread(delegate {
    //Do something related UI stuff
});

如果你为它添加一个try catch,你会得到这样的异常"You are calling a method that can only be invoked in UI thread";

顺便说一句,你不能只用do while来做动画,我给你写了一个例子,你可以看看:

public partial class ViewController : UIViewController
{
    bool needAnimate = true;
    int count = 0;
    UIView animationView = new UIView();

    public ViewController (IntPtr handle) : base (handle)
    {
    }

    public override void ViewDidLoad ()
    {
        base.ViewDidLoad ();
        // Perform any additional setup after loading the view, typically from a nib.

        animationView.Frame = new CoreGraphics.CGRect (50, 50, 100, 100);
        animationView.BackgroundColor = UIColor.Red;
        this.Add (animationView);

        this.View.AddGestureRecognizer (new UITapGestureRecognizer (() => {
            Task.Run(async () => await StartAnimation());
        }));
    }

    private async Task StartAnimation() 
    {
        do
        {
            Console.WriteLine ("count = " + count++);
            InvokeOnMainThread(delegate {
                UIView.Animate(0.25,delegate {
                    animationView.Transform = CoreGraphics.CGAffineTransform.MakeRotation((float)Math.PI / 4 * (count/4 + 1));
                });
            });
            System.Threading.Thread.Sleep(250);
        }
        while (needAnimate);
        return;
    }

    public override void DidReceiveMemoryWarning ()
    {
        base.DidReceiveMemoryWarning ();
        // Release any cached data, images, etc that aren't in use.
    }
}

动画不流畅,需要自己优化

如果你还有什么问题,就留下来,我稍后会查看。

希望对您有所帮助,欢迎来到Xamarin。

我会使用 UIView.AnimateNotify 来执行带有 CoreGraphics 的动画,并且完全避免旋转循环来做这样的事情。

将图像旋转 180 度并向后重复直到停止的示例:

bool _animateStopping = false;
protected void SpinningAnimation(bool animate)
{
    if (_animateStopping) return;
    _animateStopping = !animate;
    if (animate)
    {   
        UIView.AnimateNotify(1,
        () =>
            {
                image.Transform = CGAffineTransform.MakeRotation((nfloat)(Math.PI)); // in one second, spin 180 degrees
            },
        (bool finished) =>
        {
            UIView.AnimateNotify(1,
            () =>
                {
                    image.Transform = CGAffineTransform.MakeRotation(0); // in one second, spin it back
                },
            (bool finished2) =>
            {
                SpinningAnimation(true);
            });
        });
     }
    else {
        UIView.AnimateNotify(1,
        () =>
            {
                image.Alpha = 0; // fade away in one second
            },
        (bool finished) =>
        {
            image.RemoveFromSuperview();
            _animateStopping = false;
        }
    );}
}

用法:

image = new UIImageView(new CGRect(100, 100, 100, 100));
image.Image = UIImage.FromFile("wag.png");
Add(image);
SpinningAnimation(true);
await Task.Delay(5000); // simulate performing downloads, when done stop the animiation
SpinningAnimation(false);