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