Exemplo n.º 1
0
        NSClickGestureRecognizer CreateTapRecognizer(int numTaps, NSGestureProbe action)
        {
            var result = new NSClickGestureRecognizer();

            result.NumberOfClicksRequired        = numTaps;
            result.ShouldBegin                   = action;
            result.ShouldRecognizeSimultaneously = ShouldRecognizeTapsTogether;

            return(result);
        }
        protected virtual NativeGestureRecognizer GetNativeRecognizer(IGestureRecognizer recognizer)
        {
            if (recognizer == null)
            {
                return(null);
            }

            var weakRecognizer   = new WeakReference(recognizer);
            var weakEventTracker = new WeakReference(this);

            var tapRecognizer = recognizer as TapGestureRecognizer;

#if !__MOBILE__
            if (recognizer is ClickGestureRecognizer clickRecognizer)
            {
                var returnAction = CreateRecognizerHandler(weakEventTracker, weakRecognizer, clickRecognizer);

                var uiRecognizer = CreateClickRecognizer((int)clickRecognizer.Buttons, clickRecognizer.NumberOfClicksRequired, returnAction);
                return(uiRecognizer);
            }

            if (tapRecognizer != null)
            {
                var returnAction = new NSGestureProbe((gesturerecognizer) =>
                {
                    var tapGestureRecognizer = weakRecognizer.Target as TapGestureRecognizer;
                    var eventTracker         = weakEventTracker.Target as EventTracker;
                    var view = eventTracker?._renderer?.Element as View;

                    if (tapGestureRecognizer != null && view != null)
                    {
                        tapGestureRecognizer.SendTapped(view);
                    }

                    return(false);
                });

                var uiRecognizer = CreateTapRecognizer(tapRecognizer.NumberOfTapsRequired, returnAction);
                return(uiRecognizer);
            }
#else
            if (tapRecognizer != null)
            {
                var returnAction = CreateRecognizerHandler(weakEventTracker, weakRecognizer, tapRecognizer);

                var uiRecognizer = CreateTapRecognizer(tapRecognizer.NumberOfTapsRequired, returnAction);
                return(uiRecognizer);
            }

            var swipeRecognizer = recognizer as SwipeGestureRecognizer;
            if (swipeRecognizer != null)
            {
                var returnAction = new Action <SwipeDirection>((direction) =>
                {
                    var swipeGestureRecognizer = weakRecognizer.Target as SwipeGestureRecognizer;
                    var eventTracker           = weakEventTracker.Target as EventTracker;
                    var view = eventTracker?._renderer.Element as View;

                    if (swipeGestureRecognizer != null && view != null)
                    {
                        swipeGestureRecognizer.SendSwiped(view, direction);
                    }
                });
                var uiRecognizer = CreateSwipeRecognizer(swipeRecognizer.Direction, returnAction, 1);
                return(uiRecognizer);
            }
#endif

            if (recognizer is ChildGestureRecognizer childRecognizer)
            {
#if !__MOBILE__
                if (childRecognizer.GestureRecognizer is ClickGestureRecognizer clickChildRecognizer)
                {
                    var returnAction = CreateChildRecognizerHandler(weakEventTracker, weakRecognizer);
                    var uiRecognizer = CreateClickRecognizer((int)clickChildRecognizer.Buttons, clickChildRecognizer.NumberOfClicksRequired, returnAction);
                    return(uiRecognizer);
                }
#else
                if (childRecognizer.GestureRecognizer is TapGestureRecognizer tapChildRecognizer)
                {
                    var returnAction = CreateChildRecognizerHandler(weakEventTracker, weakRecognizer);
                    var uiRecognizer = CreateTapRecognizer(tapChildRecognizer.NumberOfTapsRequired, returnAction);
                    return(uiRecognizer);
                }
#endif
            }

            var pinchRecognizer = recognizer as PinchGestureRecognizer;
            if (pinchRecognizer != null)
            {
                double startingScale = 1;
                var    uiRecognizer  = CreatePinchRecognizer(r =>
                {
                    var pinchGestureRecognizer = weakRecognizer.Target as PinchGestureRecognizer;
                    var eventTracker           = weakEventTracker.Target as EventTracker;
                    var view = eventTracker?._renderer?.Element as View;

                    if (pinchGestureRecognizer != null && eventTracker != null && view != null)
                    {
                        var oldScale    = eventTracker._previousScale;
                        var originPoint = r.LocationInView(null);
#if __MOBILE__
                        originPoint = UIApplication.SharedApplication.KeyWindow.ConvertPointToView(originPoint, eventTracker._renderer.NativeView);
#else
                        originPoint = NSApplication.SharedApplication.KeyWindow.ContentView.ConvertPointToView(originPoint, eventTracker._renderer.NativeView);
#endif
                        var scaledPoint = new Point(originPoint.X / view.Width, originPoint.Y / view.Height);

                        switch (r.State)
                        {
                        case NativeGestureRecognizerState.Began:
#if __MOBILE__
                            if (r.NumberOfTouches < 2)
                            {
                                return;
                            }
#endif
                            pinchGestureRecognizer.SendPinchStarted(view, scaledPoint);
                            startingScale = view.Scale;
                            break;

                        case NativeGestureRecognizerState.Changed:
#if __MOBILE__
                            if (r.NumberOfTouches < 2 && pinchGestureRecognizer.IsPinching)
                            {
                                r.State = NativeGestureRecognizerState.Ended;
                                pinchGestureRecognizer.SendPinchEnded(view);
                                return;
                            }
                            var scale = r.Scale;
#else
                            var scale = r.Magnification;
#endif
                            var delta = 1.0;
                            var dif   = Math.Abs(scale - oldScale) * startingScale;
                            if (oldScale < scale)
                            {
                                delta = 1 + dif;
                            }
                            if (oldScale > scale)
                            {
                                delta = 1 - dif;
                            }

                            pinchGestureRecognizer.SendPinch(view, delta, scaledPoint);
                            eventTracker._previousScale = scale;
                            break;

                        case NativeGestureRecognizerState.Cancelled:
                        case NativeGestureRecognizerState.Failed:
                            if (pinchGestureRecognizer.IsPinching)
                            {
                                pinchGestureRecognizer.SendPinchCanceled(view);
                            }
                            break;

                        case NativeGestureRecognizerState.Ended:
                            if (pinchGestureRecognizer.IsPinching)
                            {
                                pinchGestureRecognizer.SendPinchEnded(view);
                            }
                            eventTracker._previousScale = 1;
                            break;
                        }
                    }
                });
                return(uiRecognizer);
            }

            var panRecognizer = recognizer as PanGestureRecognizer;
            if (panRecognizer != null)
            {
                var uiRecognizer = CreatePanRecognizer(panRecognizer.TouchPoints, r =>
                {
                    var eventTracker = weakEventTracker.Target as EventTracker;
                    var view         = eventTracker?._renderer?.Element as View;

                    var panGestureRecognizer = weakRecognizer.Target as PanGestureRecognizer;
                    if (panGestureRecognizer != null && view != null)
                    {
                        switch (r.State)
                        {
                        case NativeGestureRecognizerState.Began:
#if __MOBILE__
                            if (r.NumberOfTouches != panRecognizer.TouchPoints)
                            {
                                return;
                            }
#endif
                            panGestureRecognizer.SendPanStarted(view, Application.Current.PanGestureId);
                            break;

                        case NativeGestureRecognizerState.Changed:
#if __MOBILE__
                            if (r.NumberOfTouches != panRecognizer.TouchPoints)
                            {
                                r.State = NativeGestureRecognizerState.Ended;
                                panGestureRecognizer.SendPanCompleted(view, Application.Current.PanGestureId);
                                Application.Current.PanGestureId++;
                                return;
                            }
#endif
                            var translationInView = r.TranslationInView(_handler);
                            panGestureRecognizer.SendPan(view, translationInView.X, translationInView.Y, Application.Current.PanGestureId);
                            break;

                        case NativeGestureRecognizerState.Cancelled:
                        case NativeGestureRecognizerState.Failed:
                            panGestureRecognizer.SendPanCanceled(view, Application.Current.PanGestureId);
                            Application.Current.PanGestureId++;
                            break;

                        case NativeGestureRecognizerState.Ended:
#if __MOBILE__
                            if (r.NumberOfTouches != panRecognizer.TouchPoints)
                            {
                                panGestureRecognizer.SendPanCompleted(view, Application.Current.PanGestureId);
                                Application.Current.PanGestureId++;
                            }
#else
                            panGestureRecognizer.SendPanCompleted(view, Application.Current.PanGestureId);
                            Application.Current.PanGestureId++;
#endif
                            break;
                        }
                    }
                });
                return(uiRecognizer);
            }

            return(null);
        }