Анимация перевода между представлениями на xamarin. ios [Решено] - PullRequest
0 голосов
/ 18 июня 2020

Пытаюсь развить на xamari. ios, анимация состоит в переводе View, при обнаружении жеста свайпа анимация следует за пальцем и при снятии с экрана - второй вид появляется. Чтобы лучше объяснить, анимация настроек iOS, iMessage и Whatsapp (когда вы go вернетесь)

enter image description here

Я пытаюсь чтобы управлять видами вручную и программировать их движение, но мне это сложно, когда мне приходится подключать второе представление к целевому ... с существующим представлением, присутствующим в раскадровках ..

 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");*/
    }

Спасибо <3 </p>

1 Ответ

0 голосов
/ 18 июня 2020

Я решил с помощью этого кода, он еще не доработан ...

/*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;
                    }
                }
...