【问题标题】:Translation animation between views on xamarin.iosxamarin.ios 上的视图之间的翻译动画 [已解决]
【发布时间】:2020-06-17 21:14:26
【问题描述】:

我正在尝试在 xamari.ios 上开发,动画包含视图的翻译,当检测到滑动手势时,动画跟随手指,当它从屏幕上抬起时,会出现第二个视图。为了更好地解释,iOS、iMessage 和 Whatsapp 设置的动画(当你返回时)

我正在尝试手动管理视图并对其运动进行编程,但是当我必须将第二个视图连接到目标视图时,我发现很难......与故事板中存在的现有视图..

 public void AnimazioneSwipe(UIView view1, NSObject view2)
    {
        float displayW = (float)DeviceDisplay.MainDisplayInfo.Width; //Ottengo le informazioni del display corrente

        CAKeyFrameAnimation animation = (CAKeyFrameAnimation)CAKeyFrameAnimation.FromKeyPath("transform.translation.x");
        animation.TimingFunction = CAMediaTimingFunction.FromName(CAMediaTimingFunction.Linear);
        animation.Duration = 1;
        animation.Values = new NSObject[]
            {
                NSNumber.FromFloat(0),
                NSNumber.FromFloat(-displayW)
            };

        view1.Layer.AddAnimation(animation, "shake");



        /* CAKeyFrameAnimation animation2 = (CAKeyFrameAnimation)CAKeyFrameAnimation.FromKeyPath("transform.translation.x");
         animation2.TimingFunction = CAMediaTimingFunction.FromName(CAMediaTimingFunction.Linear);
         animation2.Duration = 1;
         animation2.Values = new NSObject[]
             {
                 NSNumber.FromFloat(880),
                 NSNumber.FromFloat(0)
             };



         view2.Layer.AddAnimation(animation2, "shake");*/
    }

谢谢你

【问题讨论】:

  • 其实你需要的是fade and slide/move” animation,看看link是否有帮助。
  • 是的,这就是我要说的,谢谢.. 但是这个分配很快,有没有 xamarin.ios 的 c# 的手册?
  • 无论如何我都明白了,非常感谢你

标签: c# xamarin xamarin.ios


【解决方案1】:

我用这段代码解决了,还有待完善……

/*Riproduco l'animazione di classica di iOS dove se si scorre nel bordo sinistro, in tempo reale la View si anima 
     *e si sposta indirizzando verso un altra pagina che in questo caso e la pagina precedente!
     View: La view da animare
     VCD: ViewController di destinazione*/
            public void SlideAnimation(UIView View, string VCD)
            {
                var interactiveTransitionRecognizer = new UIScreenEdgePanGestureRecognizer();
                interactiveTransitionRecognizer.AddTarget(() => InteractiveTransitionRecognizerActionWithoutIndex(interactiveTransitionRecognizer, View, VCD));
                interactiveTransitionRecognizer.Edges = UIRectEdge.Left;
                View.AddGestureRecognizer(interactiveTransitionRecognizer);
            }
            //Metodo di appoggio
            private void InteractiveTransitionRecognizerActionWithoutIndex(UIScreenEdgePanGestureRecognizer sender, UIView View, string x)
            {
                //Contiene un valore numerico che varia in base allo stato della gesture
                var percento = sender.TranslationInView(View).X * 100 / sender.View.Bounds.Size.Width;

                //Quando la gesture rileva una variazione
                if (sender.State == UIGestureRecognizerState.Changed)
                {
                    var minTransform = CGAffineTransform.MakeTranslation(sender.TranslationInView(View).X, 0); //*2 = piu rapido
                    var maxTransform = CGAffineTransform.MakeTranslation(sender.TranslationInView(View).X, 0);

                    View.Transform = true ? minTransform : maxTransform;
                    UIView.Animate(0.1, 0, UIViewAnimationOptions.CurveEaseInOut,
                        () =>
                        {
                            View.Transform = true ? maxTransform : minTransform;
                        },
                        null
                    );
                }
                //Quando la gesture termina, si alza il dito o limite schermo
                else if (sender.State == UIGestureRecognizerState.Ended)
                {
                    if (percento <= 40)
                    {
                        //Annullo l'animazion e torna in posizione
                        var minTransform = CGAffineTransform.MakeTranslation(sender.TranslationInView(View).X, 0);
                        var maxTransform = CGAffineTransform.MakeIdentity();

                        View.Transform = true ? minTransform : maxTransform;
                        UIView.Animate(0.1, 0, UIViewAnimationOptions.CurveEaseInOut,
                            () =>
                            {
                                View.Transform = true ? maxTransform : minTransform;
                            },
                            null
                        );
                    }
                    else
                    {
                        //La gesture è conclusa quindi eseguo il seguente codice
                        //Feedback haptico
                        var impact = new UIImpactFeedbackGenerator(UIImpactFeedbackStyle.Soft);
                        impact.Prepare();
                        impact.ImpactOccurred();
                        //Indirizzo
                        var storyboard = UIStoryboard.FromName("Main", null);
                        var viewController = storyboard.InstantiateViewController(x); // Your view controller here
                        UIApplication.SharedApplication.KeyWindow.RootViewController = viewController;
                    }
                }

【讨论】:

  • 如果问题得到解决,请将其标记为帮助他人的答案
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多