首页 > 解决方案 > Xamarin 窗体:如何在 Xamarin.iOS 中使用 UIViewPropertyAnimator

问题描述

我想UIViewPropertyAnimator在 Xamarin.iOS 中使用,但我的项目实际上是 Xamarin Forms 的一部分。我创建了一个依赖服务并尝试了以下操作:

var renderer = Platform.GetRenderer(view);
var uiCubicTimingParameters = new UICubicTimingParameters(new CGPoint(x: 0.4, y: 0), new CGPoint(x: 0.2, y: 1));
var uiViewPropertyAnimator = new UIViewPropertyAnimator(duration, uiCubicTimingParameters);

uiViewPropertyAnimator.AddAnimations(() =>
{
    renderer.NativeView.Transform = CGAffineTransform.MakeTranslation(300, 0);
});

uiViewPropertyAnimator.StartAnimation();

这种方法的问题在于它直接更新本机视图,但 Xamarin Forms 视图不再同步。因此,我注意到一些奇怪的 UI 问题。

UIViewPropertyAnimator在 Xamarin Forms 的情况下,正确的使用方法是什么?

标签: xamarinxamarin.formsxamarin.ios

解决方案


在开始动画之前,首先设置它的初始Transform,并且不要忘记Forms在动画完成时通知最终的变化。

参考以下代码

public async Task TranslateViewAsync(View view)
{
    var finished = false;

    CoreFoundation.DispatchQueue.MainQueue.DispatchAsync(() =>
     {
        var renderer = Platform.GetRenderer(view);
        renderer.NativeView.Transform = CGAffineTransform.MakeTranslation(375, 0);

        var uiViewPropertyAnimator = new UIViewPropertyAnimator(0.3, UIViewAnimationCurve.EaseOut, () =>
        {
             renderer.NativeView.Transform = CGAffineTransform.MakeTranslation(0, 0);
        });

        uiViewPropertyAnimator.AddCompletion(p =>
        {
             finished = true;
        });

        uiViewPropertyAnimator.StartAnimation();
    });

    while (!finished)
       await Task.Delay(10);
 }

请参阅https://github.com/xamarin/Xamarin.Forms/issues/6999#issuecomment-542488010


推荐阅读