/// <summary>
        /// Initializes a new instance of the <see cref="SlidingPanels.SlidingGestureRecogniser"/> class.
        /// </summary>
        /// <param name="panelContainers">List of Panel Containers to monitor for gestures</param>
        /// <param name="shouldReceiveTouch">Indicates that touch events should be monitored</param>
        /// <param name="slidingController">The Sliding Panels controller</param>
        /// <param name="contentView"></param>
        public SlidingGestureRecogniser(List<PanelContainer> panelContainers, UITouchEventArgs shouldReceiveTouch, UIViewController slidingController, UIView contentView)
        {
            SlidingController = slidingController;
            _panelContainers = panelContainers;

            ShouldReceiveTouch += (sender, touch) =>
            {
                if (SlidingController == null)
                {
                    return false;
                }

                if (touch.View is UIButton)
                {
                    return false;
                }

                var validTouch = false;
                var touchView = touch.View;
                while (touchView != null)
                {
                    if (Equals(touchView, contentView))
                    {
                        validTouch = true;
                        break;
                    }
                    touchView = touchView.Superview;
                }

                return validTouch && shouldReceiveTouch(sender, touch);
            };
        }
        /// <summary>
        /// Initializes a new instance of the <see cref="SlidingPanels.Lib.SlidingGestureRecogniser"/> class.
        /// </summary>
        /// <param name="panelContainers">List of Panel Containers to monitor for gestures</param>
        /// <param name="shouldReceiveTouch">Indicates that touch events should be monitored</param>
        /// <param name="slidingController">The Sliding Panels controller</param>
        public SlidingGestureRecogniser(List <PanelContainer> panelContainers, UITouchEventArgs shouldReceiveTouch, UIViewController slidingController, UIView contentView)
        {
            SlidingController = slidingController;
            _panelContainers  = panelContainers;

            this.ShouldReceiveTouch += (sender, touch) => {
                if (SlidingController == null)
                {
                    return(false);
                }

                if (touch.View is UIButton)
                {
                    return(false);
                }

                bool   validTouch = false;
                UIView touchView  = touch.View;
                while (touchView != null)
                {
                    if (touchView == contentView)
                    {
                        validTouch = true;
                        break;
                    }
                    touchView = touchView.Superview;
                }
                if (!validTouch)
                {
                    return(false);
                }

                return(shouldReceiveTouch(sender, touch));
            };
        }
		void UpdatePanGesture()
		{
			var model = (MasterDetailPage)Element;
			if (!model.IsGestureEnabled)
			{
				if (_panGesture != null)
					View.RemoveGestureRecognizer(_panGesture);
				return;
			}

			if (_panGesture != null)
			{
				View.AddGestureRecognizer(_panGesture);
				return;
			}

			UITouchEventArgs shouldRecieve = (g, t) => !(t.View is UISlider);
			var center = new PointF();
			_panGesture = new UIPanGestureRecognizer(g =>
			{
				switch (g.State)
				{
					case UIGestureRecognizerState.Began:
						center = g.LocationInView(g.View);
						break;
					case UIGestureRecognizerState.Changed:
						var currentPosition = g.LocationInView(g.View);
						var motion = currentPosition.X - center.X;
						var detailView = _detailController.View;
						var targetFrame = detailView.Frame;
						if (Presented)
							targetFrame.X = (nfloat)Math.Max(0, _masterController.View.Frame.Width + Math.Min(0, motion));
						else
							targetFrame.X = (nfloat)Math.Min(_masterController.View.Frame.Width, Math.Max(0, motion));
						detailView.Frame = targetFrame;
						break;
					case UIGestureRecognizerState.Ended:
						var detailFrame = _detailController.View.Frame;
						var masterFrame = _masterController.View.Frame;
						if (Presented)
						{
							if (detailFrame.X < masterFrame.Width * .75)
								Presented = false;
							else
								LayoutChildren(true);
						}
						else
						{
							if (detailFrame.X > masterFrame.Width * .25)
								Presented = true;
							else
								LayoutChildren(true);
						}
						break;
				}
			});
			_panGesture.ShouldReceiveTouch = shouldRecieve;
			_panGesture.MaximumNumberOfTouches = 2;
			View.AddGestureRecognizer(_panGesture);
		}
        public override void ViewDidLoad()
        {
            base.ViewDidLoad();

            ((MasterDetailPage)Element).PropertyChanged += HandlePropertyChanged;

            var model = (MasterDetailPage)Element;

            if (!model.IsGestureEnabled)
            {
                if (_panGesture != null)
                {
                    View.RemoveGestureRecognizer(_panGesture);
                }
                return;
            }

            if (_panGesture != null)
            {
                View.AddGestureRecognizer(_panGesture);
                return;
            }

            UITouchEventArgs shouldReceive = (g, t) => !(t.View is UISlider);
            var center = new PointF();

            _panGesture = new UIPanGestureRecognizer(g =>
            {
                var detailRenderer  = Platform.GetRenderer(((MasterDetailPage)Element).Detail);
                var masterRenderer  = Platform.GetRenderer(((MasterDetailPage)Element).Master);
                var translation     = g.TranslationInView(View).X;
                var presented       = ((MasterDetailPage)Element).IsPresented;
                double openProgress = 0;
                double openLimit    = masterRenderer.ViewController.View.Frame.Width;

                if (presented)
                {
                    openProgress = 1 - (-translation / openLimit);
                }
                else
                {
                    openProgress = translation / openLimit;
                }

                openProgress = Math.Min(Math.Max(openProgress, 0.0), 1.0);
                switch (g.State)
                {
                case UIGestureRecognizerState.Changed:
                    LayoutViews(View.Bounds, (nfloat)openProgress, detailRenderer.ViewController.View);
                    break;
                }
            })
            {
                ShouldReceiveTouch     = shouldReceive,
                MaximumNumberOfTouches = 2
            };
            _panGesture.ShouldRecognizeSimultaneously = (gesture1, gesture2) => true;
            View.AddGestureRecognizer(_panGesture);
        }
Ejemplo n.º 5
0
		public void LoadEvents(UIView handler)
		{
			if (_disposed)
				throw new ObjectDisposedException(null);

			_shouldReceive = (r, t) => t.View is IVisualElementRenderer;

			_handler = handler;
			OnElementChanged(this, new VisualElementChangedEventArgs(null, _renderer.Element));
		}
Ejemplo n.º 6
0
        public void LoadEvents(NativeView handler)
        {
            if (_disposed)
            {
                throw new ObjectDisposedException(null);
            }
#if __MOBILE__
            _shouldReceive = (r, t) => t.View is IVisualElementRenderer;
#endif
            _handler = handler;
            OnElementChanged(this, new VisualElementChangedEventArgs(null, _renderer.Element));
        }
Ejemplo n.º 7
0
        void LoadRecognizers()
        {
            if (ElementGestureRecognizers == null)
            {
                return;
            }

#if __MOBILE__
            if (_shouldReceiveTouch == null)
            {
                // Cache this so we don't create a new UITouchEventArgs instance for every recognizer
                _shouldReceiveTouch = ShouldReceiveTouch;
            }
#endif

            for (int i = 0; i < ElementGestureRecognizers.Count; i++)
            {
                IGestureRecognizer recognizer = ElementGestureRecognizers[i];
                if (_gestureRecognizers.ContainsKey(recognizer))
                {
                    continue;
                }

                var nativeRecognizer = GetNativeRecognizer(recognizer);
                if (nativeRecognizer != null)
                {
#if __MOBILE__
                    nativeRecognizer.ShouldReceiveTouch = _shouldReceiveTouch;
#endif
                    _handler.AddGestureRecognizer(nativeRecognizer);

                    _gestureRecognizers[recognizer] = nativeRecognizer;
                }
            }

            var toRemove = _gestureRecognizers.Keys.Where(key => !ElementGestureRecognizers.Contains(key)).ToArray();

            for (int i = 0; i < toRemove.Length; i++)
            {
                IGestureRecognizer gestureRecognizer = toRemove[i];
                var uiRecognizer = _gestureRecognizers[gestureRecognizer];
                _gestureRecognizers.Remove(gestureRecognizer);

                _handler.RemoveGestureRecognizer(uiRecognizer);
                uiRecognizer.Dispose();
            }
        }
Ejemplo n.º 8
0
        void UpdatePanGesture()
        {
            var model = (MasterDetailPage)Element;

            if (!model.IsGestureEnabled)
            {
                if (_panGesture != null)
                {
                    View.RemoveGestureRecognizer(_panGesture);
                }
                return;
            }

            if (_panGesture != null)
            {
                View.AddGestureRecognizer(_panGesture);
                return;
            }

            UITouchEventArgs shouldRecieve = (g, t) => !(t.View is UISlider);
            var center = new PointF();

            _panGesture = new UIPanGestureRecognizer(g =>
            {
                // Adjusted to following code to support the right-to-left case.
                // -----------------------------------------
                // START ORIGINAL XAMARIN.FORMS CODE
                // -----------------------------------------
                //switch (g.State)
                //{
                //    case UIGestureRecognizerState.Began:
                //        center = g.LocationInView(g.View);
                //        break;
                //    case UIGestureRecognizerState.Changed:
                //        var currentPosition = g.LocationInView(g.View);
                //        var motion = currentPosition.X - center.X;
                //        var detailView = _detailController.View;
                //        var targetFrame = detailView.Frame;
                //        if (Presented)
                //            targetFrame.X = (nfloat)Math.Max(0, _masterController.View.Frame.Width + Math.Min(0, motion));
                //        else
                //            targetFrame.X = (nfloat)Math.Min(_masterController.View.Frame.Width, Math.Max(0, motion));
                //        detailView.Frame = targetFrame;
                //        break;
                //    case UIGestureRecognizerState.Ended:
                //        var detailFrame = _detailController.View.Frame;
                //        var masterFrame = _masterController.View.Frame;
                //        if (Presented)
                //        {
                //            if (detailFrame.X < masterFrame.Width * .75)
                //                Presented = false;
                //            else
                //                LayoutChildren(true);
                //        }
                //        else
                //        {
                //            if (detailFrame.X > masterFrame.Width * .25)
                //                Presented = true;
                //            else
                //                LayoutChildren(true);
                //        }
                //        break;
                //}
                // -----------------------------------------
                // END ORIGINAL XAMARIN.FORMS CODE
                // -----------------------------------------

                switch (g.State)
                {
                case UIGestureRecognizerState.Began:
                    center = g.LocationInView(g.View);
                    break;

                case UIGestureRecognizerState.Changed:
                    var currentPosition = g.LocationInView(g.View);
                    var motion          = _isRightToLeft ? -currentPosition.X + center.X : currentPosition.X - center.X;
                    var detailView      = _detailController.View;
                    var targetFrame     = detailView.Frame;
                    if (Presented)
                    {
                        targetFrame.X = _isRightToLeft ?
                                        -(nfloat)Math.Max(0, _masterController.View.Frame.Width + Math.Min(0, motion)) :
                                        (nfloat)Math.Max(0, _masterController.View.Frame.Width + Math.Min(0, motion));
                    }
                    else
                    {
                        targetFrame.X = _isRightToLeft ?
                                        -(nfloat)Math.Min(_masterController.View.Frame.Width, Math.Max(0, motion)) :
                                        (nfloat)Math.Min(_masterController.View.Frame.Width, Math.Max(0, motion));
                    }
                    detailView.Frame = targetFrame;
                    break;

                case UIGestureRecognizerState.Ended:
                    var detailFrame = _detailController.View.Frame;
                    var masterFrame = _masterController.View.Frame;
                    if (Presented)
                    {
                        if ((_isRightToLeft && (detailFrame.X > -masterFrame.Width * .75)) ||
                            (!_isRightToLeft && (detailFrame.X < masterFrame.Width * .75)))
                        {
                            Presented = false;
                        }
                        else
                        {
                            LayoutChildren(true);
                        }
                    }
                    else
                    {
                        if ((_isRightToLeft && (detailFrame.X < -masterFrame.Width * .25)) ||
                            (!_isRightToLeft && (detailFrame.X > masterFrame.Width * .25)))
                        {
                            Presented = true;
                        }
                        else
                        {
                            LayoutChildren(true);
                        }
                    }
                    break;
                }
            });
            _panGesture.ShouldReceiveTouch     = shouldRecieve;
            _panGesture.MaximumNumberOfTouches = 2;
            View.AddGestureRecognizer(_panGesture);
        }
Ejemplo n.º 9
0
        void LoadRecognizers()
        {
            if (ElementGestureRecognizers == null)
            {
                return;
            }

#if __MOBILE__
            if (_shouldReceiveTouch == null)
            {
                // Cache this so we don't create a new UITouchEventArgs instance for every recognizer
                _shouldReceiveTouch = ShouldReceiveTouch;
            }
#endif

#if __MOBILE__
            UIDragInteraction uIDragInteraction = null;
            UIDropInteraction uIDropInteraction = null;

            if (_dragAndDropDelegate != null)
            {
                foreach (var interaction in _renderer.NativeView.Interactions)
                {
                    if (interaction is UIDragInteraction uIDrag && uIDrag.Delegate == _dragAndDropDelegate)
                    {
                        uIDragInteraction = uIDrag;
                    }

                    if (interaction is UIDropInteraction uiDrop && uiDrop.Delegate == _dragAndDropDelegate)
                    {
                        uIDropInteraction = uiDrop;
                    }
                }
            }

            bool dragFound = false;
            bool dropFound = false;
#endif
            for (int i = 0; i < ElementGestureRecognizers.Count; i++)
            {
                IGestureRecognizer recognizer = ElementGestureRecognizers[i];
                if (_gestureRecognizers.ContainsKey(recognizer))
                {
                    continue;
                }

                var nativeRecognizer = GetNativeRecognizer(recognizer);
                if (nativeRecognizer != null && _handler != null)
                {
#if __MOBILE__
                    nativeRecognizer.ShouldReceiveTouch = _shouldReceiveTouch;
#endif
                    _handler.AddGestureRecognizer(nativeRecognizer);

                    _gestureRecognizers[recognizer] = nativeRecognizer;
                }

#if __MOBILE__
                if (Forms.IsiOS11OrNewer && recognizer is DragGestureRecognizer)
                {
                    dragFound            = true;
                    _dragAndDropDelegate = _dragAndDropDelegate ?? new DragAndDropDelegate();
                    if (uIDragInteraction == null)
                    {
                        var interaction = new UIDragInteraction(_dragAndDropDelegate);
                        interaction.Enabled = true;
                        _renderer.NativeView.AddInteraction(interaction);
                    }
                }

                if (Forms.IsiOS11OrNewer && recognizer is DropGestureRecognizer)
                {
                    dropFound            = true;
                    _dragAndDropDelegate = _dragAndDropDelegate ?? new DragAndDropDelegate();
                    if (uIDropInteraction == null)
                    {
                        var interaction = new UIDropInteraction(_dragAndDropDelegate);
                        _renderer.NativeView.AddInteraction(interaction);
                    }
                }
#endif
            }

#if __MOBILE__
            if (!dragFound && uIDragInteraction != null)
            {
                _renderer.NativeView.RemoveInteraction(uIDragInteraction);
            }

            if (!dropFound && uIDropInteraction != null)
            {
                _renderer.NativeView.RemoveInteraction(uIDropInteraction);
            }
#endif

            var toRemove = _gestureRecognizers.Keys.Where(key => !ElementGestureRecognizers.Contains(key)).ToArray();

            for (int i = 0; i < toRemove.Length; i++)
            {
                IGestureRecognizer gestureRecognizer = toRemove[i];
                var uiRecognizer = _gestureRecognizers[gestureRecognizer];
                _gestureRecognizers.Remove(gestureRecognizer);

                _handler.RemoveGestureRecognizer(uiRecognizer);
                uiRecognizer.Dispose();
            }
        }
		/// <summary>
		/// Initializes a new instance of the <see cref="SlidingPanels.Lib.SlidingGestureRecogniser"/> class.
		/// </summary>
		/// <param name="panelContainers">List of Panel Containers to monitor for gestures</param>
		/// <param name="shouldReceiveTouch">Indicates that touch events should be monitored</param>
		/// <param name="slidingController">The Sliding Panels controller</param>
		public SlidingGestureRecogniser (List<PanelContainer> panelContainers, UITouchEventArgs shouldReceiveTouch, UIViewController slidingController, UIView contentView)
		{
			SlidingController = slidingController;
			_panelContainers = panelContainers;

			this.ShouldReceiveTouch += (sender, touch) => {
				if (SlidingController == null) 
				{ 
					return false; 
				}

				if (touch.View is UIButton) 
				{ 
					return false; 
				}

				bool validTouch = false;
				UIView touchView = touch.View;
				while (touchView != null)
				{
					if (touchView == contentView)
					{
						validTouch = true;
						break;
					}
					touchView = touchView.Superview;
				}
				if (!validTouch)
				{
					return false;
				}

				return shouldReceiveTouch(sender, touch);
			};
		}
		/// <summary>
		/// Initializes a new instance of the <see cref="SlidingPanels.Lib.SlidingGestureRecogniser"/> class.
		/// </summary>
		/// <param name="panelContainers">List of Panel Containers to monitor for gestures</param>
		/// <param name="shouldReceiveTouch">Indicates that touch events should be monitored</param>
		/// <param name="slidingController">The Sliding Panels controller</param>
		public SlidingGestureRecogniser (List<PanelContainer> panelContainers, UITouchEventArgs shouldReceiveTouch, UIViewController slidingController)
		{
			SlidingController = slidingController;
			_panelContainers = panelContainers;

			this.ShouldReceiveTouch += (sender, touch) => {
				if (SlidingController == null) 
				{ 
					return false; 
				}

				if (touch.View is UIButton) 
				{ 
					return false; 
				}

				return shouldReceiveTouch(sender, touch);
			};
		}
        void UpdatePanGesture()
        {
            var model = (MasterDetailPage)Element;

            if (!model.IsGestureEnabled)
            {
                if (_panGesture != null)
                {
                    View.RemoveGestureRecognizer(_panGesture);
                }
                return;
            }

            if (_panGesture != null)
            {
                View.AddGestureRecognizer(_panGesture);
                return;
            }

            UITouchEventArgs shouldReceive = (g, t) => !(t.View is UISlider);
            var center = new PointF();

            _panGesture = new UIPanGestureRecognizer(g =>
            {
                var isRTL = (Element as IVisualElementController)?.EffectiveFlowDirection.IsRightToLeft() == true;

                int directionModifier = isRTL ? -1 : 1;

                switch (g.State)
                {
                case UIGestureRecognizerState.Began:
                    center = g.LocationInView(g.View);
                    break;

                case UIGestureRecognizerState.Changed:
                    var currentPosition = g.LocationInView(g.View);
                    var motion          = currentPosition.X - center.X;

                    motion = motion * directionModifier;

                    var detailView  = _detailController.View;
                    var targetFrame = detailView.Frame;
                    if (Presented)
                    {
                        targetFrame.X = (nfloat)Math.Max(0, _masterController.View.Frame.Width + Math.Min(0, motion));
                    }
                    else
                    {
                        targetFrame.X = (nfloat)Math.Min(_masterController.View.Frame.Width, Math.Max(0, motion));
                    }

                    targetFrame.X = targetFrame.X * directionModifier;

                    detailView.Frame = targetFrame;
                    break;

                case UIGestureRecognizerState.Ended:
                    var detailFrame = _detailController.View.Frame;
                    var masterFrame = _masterController.View.Frame;
                    if (Presented)
                    {
                        if (detailFrame.X * directionModifier < masterFrame.Width * .75)
                        {
                            Presented = false;
                        }
                        else
                        {
                            LayoutChildren(true);
                        }
                    }
                    else
                    {
                        if (detailFrame.X * directionModifier > masterFrame.Width * .25)
                        {
                            Presented = true;
                        }
                        else
                        {
                            LayoutChildren(true);
                        }
                    }
                    break;
                }
            });
            _panGesture.ShouldReceiveTouch     = shouldReceive;
            _panGesture.MaximumNumberOfTouches = 2;
            View.AddGestureRecognizer(_panGesture);
        }
Ejemplo n.º 13
0
        void UpdatePanGesture()
        {
            var model = (MasterDetailPage)Element;

            if (!model.IsGestureEnabled)
            {
                if (_panGesture != null)
                {
                    View.RemoveGestureRecognizer(_panGesture);
                }
                return;
            }

            if (_panGesture != null)
            {
                View.AddGestureRecognizer(_panGesture);
                return;
            }

            UITouchEventArgs shouldRecieve = (g, touch) =>
            {
                bool isMovingCell =
                    touch.View.ToString().IndexOf("UITableViewCellReorderControl", StringComparison.InvariantCultureIgnoreCase) >
                    -1;

                if (isMovingCell || touch.View is UISlider || touch.View is ProgressViewRenderer || touch.View is MPVolumeView)
                {
                    return(false);
                }
                return(true);
            };
            var    center    = new PointF();
            nfloat startY    = 0;
            bool   isPanning = false;

            _panGesture = new UIPanGestureRecognizer(g =>
            {
                var frame          = _masterController.View.Frame;
                nfloat translation = g.TranslationInView(this.View).Y;
                switch (g.State)
                {
                case UIGestureRecognizerState.Began:
                    isPanning = true;
                    startY    = frame.Y;
                    center    = g.LocationInView(g.View);
                    break;

                case UIGestureRecognizerState.Changed:
                    frame.Y = translation + startY;
                    frame.Y = NMath.Min(frame.Height, NMath.Max(frame.Y, 0));
                    (this.Element as SlideUpPanel).PercentVisible = (float)((frame.Height - frame.Y) / frame.Height);

                    _masterController.View.Frame = frame;
                    break;

                case UIGestureRecognizerState.Ended:
                    isPanning    = false;
                    var velocity = g.VelocityInView(this.View).Y;
                    //					Console.WriteLine (velocity);
                    var show = (Math.Abs(velocity) > FlickVelocity)
                            ? (velocity < 0)
                            : (translation * -1 > 100);
                    float playbackBarHideTollerance = (float)Model.OverHang * 2 / 3;
                    if (show)
                    {
                        Presented = true;
                        (this.Element as SlideUpPanel).PercentVisible = 1;
                    }
                    else
                    {
                        Presented = false;
                        (this.Element as SlideUpPanel).PercentVisible = 0;
                    }
                    LayoutChildren(true);
                    break;
                }
            })
            {
                ShouldReceiveTouch     = shouldRecieve,
                MaximumNumberOfTouches = 2
            };
            View.AddGestureRecognizer(_panGesture);
        }
Ejemplo n.º 14
0
        void UpdatePanGesture()
        {
            var model = (MasterDetailPage)Element;

            if (!model.IsGestureEnabled)
            {
                if (_panGesture != null)
                {
                    View.RemoveGestureRecognizer(_panGesture);
                }
                return;
            }

            if (_panGesture != null)
            {
                View.AddGestureRecognizer(_panGesture);
                return;
            }

            UITouchEventArgs shouldReceive = (g, t) => !(t.View is UISlider);
            var center = new PointF();

            _panGesture = new UIPanGestureRecognizer(g =>
            {
                switch (g.State)
                {
                case UIGestureRecognizerState.Began:
                    center = g.LocationInView(g.View);
                    break;

                case UIGestureRecognizerState.Changed:
                    var currentPosition = g.LocationInView(g.View);
                    var motion          = currentPosition.X - center.X;
                    //var alpha = -(1 / motion);

                    var masterView       = _masterController.View;
                    var detailView       = _detailController.View;
                    var targetFrame      = masterView.Frame;
                    var clickView        = _clickOffView;
                    var targetClickFrame = clickView.Frame;


                    if (renderMode == MasterDetailType.Overlay)
                    {
                        targetFrame = masterView.Frame;
                        if (Presented)
                        {
                            targetFrame.X = (nfloat)Math.Max(0, _masterController.View.Frame.Width + Math.Min(0, motion));
                            //targetFrame.X = 400;
                            //_clickOffView.Alpha = (nfloat)alpha;
                        }
                        else
                        {
                            targetFrame.X = (nfloat)Math.Min(_masterController.View.Frame.Width, Math.Max(0, motion));
                            //_clickOffView.BackgroundColor = _clickOffView.BackgroundColor.ColorWithAlpha((nfloat)alpha);
                        }

                        targetFrame.X = (targetFrame.X - _masterController.View.Frame.Width);
                        alphaOpacity  = Map(targetFrame.X, -_masterController.View.Frame.Width, 0, 0, 0.8);
                        //if (alphaOpacity > 0 && _opacityView.Superview == null)
                        //{
                        //    //_opacityView.Frame = _detailController.View.Frame;
                        //    AddOpacityView();
                        //}
                        //else if (alphaOpacity < 10e-8 && _opacityView.Superview != null)
                        //{
                        //    RemoveOpacityView();
                        //}
                        masterView.Frame = targetFrame;

                        _opacityView.BackgroundColor = _opacityView.BackgroundColor.ColorWithAlpha((nfloat)alphaOpacity);
                    }
                    else
                    {
                        targetFrame = detailView.Frame;
                        //clickOffViewFrame = targetFrame;
                        if (Presented)
                        {
                            targetFrame.X      = (nfloat)Math.Max(0, _masterController.View.Frame.Width + Math.Min(0, motion));
                            targetClickFrame.X = (nfloat)Math.Max(0, _masterController.View.Frame.Width + Math.Min(0, motion));
                        }
                        else
                        {
                            targetFrame.X      = (nfloat)Math.Min(_masterController.View.Frame.Width, Math.Max(0, motion));
                            targetClickFrame.X = (nfloat)Math.Max(0, _masterController.View.Frame.Width + Math.Min(0, motion));
                        }

                        //targetFrame.X = targetFrame.X * directionModifier;

                        detailView.Frame = targetFrame;
                    }

                    break;

                case UIGestureRecognizerState.Ended:
                    var detailFrame = _detailController.View.Frame;
                    var masterFrame = _masterController.View.Frame;
                    if (renderMode == MasterDetailType.Overlay)
                    {
                        if (Presented)
                        {
                            if ((masterFrame.X + _masterController.View.Frame.Width) < masterFrame.Width * .75)
                            {
                                Presented = false;
                            }
                            else
                            {
                                LayoutChildren(true);
                                _opacityView.BackgroundColor = _opacityView.BackgroundColor.ColorWithAlpha((nfloat)0.8);
                            }
                        }
                        else
                        {
                            if ((masterFrame.X + _masterController.View.Frame.Width) > masterFrame.Width * .25)
                            {
                                //LayoutChildren(true);
                                Presented = true;
                            }
                            else
                            {
                                LayoutChildren(true);
                            }
                        }
                    }
                    else
                    {
                        if (Presented)
                        {
                            if (detailFrame.X < masterFrame.Width * .75)
                            {
                                Presented = false;
                            }
                            else
                            {
                                LayoutChildren(true);
                            }
                        }
                        else
                        {
                            if (detailFrame.X > masterFrame.Width * .25)
                            {
                                Presented = true;
                            }
                            else
                            {
                                LayoutChildren(true);
                            }
                        }
                    }
                    break;
                }
            });
            _panGesture.ShouldReceiveTouch     = shouldReceive;
            _panGesture.MaximumNumberOfTouches = 2;
            View.AddGestureRecognizer(_panGesture);
        }