/// <summary> /// Invoked when a touch gesture begins. /// </summary> /// <param name="touches">To be added.</param> /// <param name="evt">To be added.</param> /// <remarks>To be added.</remarks> public override void TouchesBegan(NSSet touches, UIEvent evt) { base.TouchesBegan(touches, evt); if (NumberOfTouches > 1) { State = UIGestureRecognizerState.Failed; return; } // A new touch cancels any outstanding Touches. if (_timer != null) { _timer.Dispose(); } _timer = new Timer { AutoReset = false, Enabled = true, Interval = HoldToBeginThresholdMilliseconds }; _timer.Elapsed += TimerOnElapsed; DownAt = GetTouchPoint(); ViewWasAt = View.Center; State = UIGestureRecognizerState.Possible; #if DRAGDROP_VERBOSE_DEBUGGING Debug.WriteLine("DragDropGesture #{0}: Begin at {1},{2}", ++_serial, DownAt.X, DownAt.Y); #endif }
GestureRecognizerState GetGestureRecognizerStateFromUIState(UIGestureRecognizerState state) { switch (state) { case UIGestureRecognizerState.Possible: return(GestureRecognizerState.Possible); case UIGestureRecognizerState.Began: return(GestureRecognizerState.Began); case UIGestureRecognizerState.Changed: return(GestureRecognizerState.Changed); case UIGestureRecognizerState.Ended: return(GestureRecognizerState.Ended); case UIGestureRecognizerState.Cancelled: return(GestureRecognizerState.Cancelled); case UIGestureRecognizerState.Failed: return(GestureRecognizerState.Failed); default: throw new ArgumentOutOfRangeException(); } }
void LongTapAction(UIGestureRecognizerState state, bool inside) { switch (state) { case UIGestureRecognizerState.Began: break; case UIGestureRecognizerState.Ended: if (!inside) { return; } if (_longCommand == null) { TapAction(); } else if (_longCommand?.CanExecute(_longParameter) ?? false) { _longCommand.Execute(_longParameter); } break; case UIGestureRecognizerState.Cancelled: case UIGestureRecognizerState.Failed: break; } }
public DragDropEventArgs(UIGestureRecognizerState state, CGPoint point, CGPoint delta, CGPoint viewWasAt) { State = state; Point = point; Delta = delta; ViewWasAt = viewWasAt; }
private void LongTapAction(UIGestureRecognizerState state) { switch (state) { case UIGestureRecognizerState.Began: break; case UIGestureRecognizerState.Ended: if (_longCommand == null) { TapAction(); } else { TaskMonitor.Create( async() => { await Task.Delay(50); _longCommand.Execute(_longParameter); }); } break; case UIGestureRecognizerState.Cancelled: case UIGestureRecognizerState.Failed: break; } }
public static GestureState ToGestureState(this UIGestureRecognizerState state) { var name = Enum.GetName(typeof(UIGestureRecognizerState), state); GestureState result; if (Enum.TryParse <GestureState>(name, out result)) { return(result); } return(GestureState.Possible); }
private void LongTapAction(UIGestureRecognizerState state) { switch (state) { case UIGestureRecognizerState.Began: TaskMonitor.Create(TapAnimationAsync(0.5, 0, _alpha, false)); break; case UIGestureRecognizerState.Ended: case UIGestureRecognizerState.Cancelled: case UIGestureRecognizerState.Failed: TaskMonitor.Create(TapAnimationAsync(0.5, _alpha)); break; } }
/// <summary> /// Invoked when a touch gesture is cancelled. /// </summary> /// <param name="touches">To be added.</param> /// <param name="evt">To be added.</param> /// <remarks>To be added.</remarks> public override void TouchesCancelled(NSSet touches, UIEvent evt) { base.TouchesCancelled(touches, evt); if (_timer != null) { _timer.Dispose(); } _timer = null; State = UIGestureRecognizerState.Failed; #if DRAGDROP_VERBOSE_DEBUGGING Debug.WriteLine("DragDropGesture #{0}: Cancelled", _serial); #endif }
private void TrackGestureEnded(UIGestureRecognizerState state) { if (InteractionInProgress) { InteractionInProgress = false; if (!shouldCompleteTransition || state == UIGestureRecognizerState.Cancelled) { CancelInteractiveTransition(); } else { FinishInteractiveTransition(); } } }
/// <summary> /// Inboked when a touch gesture moves. /// </summary> /// <param name="touches">To be added.</param> /// <param name="evt">To be added.</param> /// <remarks>To be added.</remarks> public override void TouchesMoved(NSSet touches, UIEvent evt) { base.TouchesMoved(touches, evt); if (State == UIGestureRecognizerState.Failed) { return; } // After long press: if (DidLongPress) { var dragat = GetTouchPoint(); if (dragat == DragAt) { return; // Not noteworthy. } DragAt = dragat; if (!StayedPut(DownAt, DragAt)) { DidDrag = true; OnDragging(this, new DragDropEventArgs(State, DragAt, Delta, ViewWasAt, DownAt)); State = UIGestureRecognizerState.Changed; } } // Before long press: else { if (StayedPut(GetTouchPoint(), DownAt)) { return; } if (_timer != null) { _timer.Dispose(); } _timer = null; State = UIGestureRecognizerState.Failed; #if DRAGDROP_VERBOSE_DEBUGGING Debug.WriteLine("DragDropGesture #{0}: Moved prematurely", _serial); #endif } }
private async void LongTapAction(UIGestureRecognizerState state) { switch (state) { case UIGestureRecognizerState.Began: await TapAnimation(0.5, 0, _alpha, false); break; case UIGestureRecognizerState.Ended: case UIGestureRecognizerState.Cancelled: case UIGestureRecognizerState.Failed: await TapAnimation(0.5, _alpha); break; } }
/// <summary> /// Invoked when the timer elapsed. /// </summary> /// <param name="sender">The sender.</param> /// <param name="elapsedEventArgs">The <see cref="ElapsedEventArgs"/> instance containing the event data.</param> private void TimerOnElapsed(object sender, ElapsedEventArgs elapsedEventArgs) { var timer = sender as Timer; // Could be from an previous timer that wasn't stopped in time. if (timer == _timer) { DidLongPress = true; _timer.Stop(); _timer.Dispose(); _timer = null; #if DRAGDROP_VERBOSE_DEBUGGING Debug.WriteLine("DragDropGesture #{0}: Held", _serial); #endif OnHeld(this, new DragDropEventArgs(default(UIGestureRecognizerState), DragAt, Delta, ViewWasAt, DownAt)); State = UIGestureRecognizerState.Changed; } }
/// <summary> /// Inboked when a touch gesture moves. /// </summary> /// <param name="touches">To be added.</param> /// <param name="evt">To be added.</param> /// <remarks>To be added.</remarks> public override void TouchesMoved(NSSet touches, UIEvent evt) { base.TouchesMoved(touches, evt); if (State == UIGestureRecognizerState.Failed) { return; } // After long press: if (DidLongPress) { var dragat = GetTouchPoint(); if (dragat == DragAt) { return; // Not noteworthy. } DragAt = dragat; if (!StayedPut(DownAt, DragAt)) { DidDrag = true; //OnDragging(this, new DragDropEventArgs(State, DragAt, Delta, ViewWasAt)); State = UIGestureRecognizerState.Changed; } } // Before long press: else { if (StayedPut(GetTouchPoint(), DownAt)) { return; } if (_timer != null) { _timer.Dispose(); } _timer = null; State = UIGestureRecognizerState.Failed; } }
/// <summary> /// Resets the state of the gesture recognizer. /// </summary> /// <remarks>To be added.</remarks> public override void Reset() { base.Reset(); if (_timer != null) { _timer.Stop(); _timer.Dispose(); } _timer = null; State = UIGestureRecognizerState.Possible; DownAt = CGPoint.Empty; DragAt = CGPoint.Empty; DidLongPress = false; DidDrag = false; #if DRAGDROP_VERBOSE_DEBUGGING Debug.WriteLine("DragDropGesture #{0}: Reset", _serial); #endif }
/// <summary> /// Invoked when a touch gesture ends. /// </summary> /// <param name="touches">To be added.</param> /// <param name="evt">To be added.</param> /// <remarks>To be added.</remarks> public override void TouchesEnded(NSSet touches, UIEvent evt) { base.TouchesEnded(touches, evt); if (_timer != null) { _timer.Dispose(); } _timer = null; if (DidDrag) { State = UIGestureRecognizerState.Recognized; OnDropped(this, new DragDropEventArgs(State, DragAt, Delta, ViewWasAt, DownAt)); } else { State = UIGestureRecognizerState.Failed; } }
public static void MapGestureStateToInteractor(UIGestureRecognizerState state, float progress, Interactor interactor, Action triggerSegue) { if (interactor == null) { return; } switch (state) { case UIGestureRecognizerState.Began: interactor.HasStarted = true; triggerSegue?.Invoke(); break; case UIGestureRecognizerState.Changed: interactor.ShouldFinish = progress > PercentTreshold; interactor.UpdateInteractiveTransition(progress); break; case UIGestureRecognizerState.Cancelled: interactor.HasStarted = false; interactor.CancelInteractiveTransition(); break; case UIGestureRecognizerState.Ended: interactor.HasStarted = false; if (interactor.ShouldFinish) { interactor.FinishInteractiveTransition(); } else { interactor.CancelInteractiveTransition(); } break; default: break; } }
private async void LongTapAction(UIGestureRecognizerState state) { switch (state) { case UIGestureRecognizerState.Began: await Task.Delay(500); _longCommand?.Execute(_longParameter); break; case UIGestureRecognizerState.Ended: if (_longCommand == null) { TapAction(); } break; case UIGestureRecognizerState.Cancelled: case UIGestureRecognizerState.Failed: break; } }
GestureState UIStateToNodeState(UIGestureRecognizerState state) { switch (state) { case UIGestureRecognizerState.Began: return(GestureState.Began); case UIGestureRecognizerState.Cancelled: return(GestureState.Cancelled); case UIGestureRecognizerState.Changed: return(GestureState.Update); case UIGestureRecognizerState.Ended: return(GestureState.Ended); case UIGestureRecognizerState.Failed: return(GestureState.Failed); case UIGestureRecognizerState.Possible: return(GestureState.Possible); } return(GestureState.Failed); }
private void HandleDragByGestureState( UIGestureRecognizerState state, UIGestureRecognizer gesture, ref int from, ref NSIndexPath pathTo, ref iOSViewCell draggedViewCell) { switch (state) { case UIGestureRecognizerState.Began: var selectedIndexPath = Control.IndexPathForItemAtPoint(gesture.LocationInView(Control)); if (selectedIndexPath != null) { draggedViewCell = (iOSViewCell)Control.CellForItem(selectedIndexPath); if (draggedViewCell.FormsCell is DraggableViewCell draggableViewCell) { if (!draggableViewCell.IsDraggable) { Control.CancelInteractiveMovement(); return; } draggableViewCell.IsDragAndDropping = true; } from = (int)selectedIndexPath.Item; Control.BeginInteractiveMovementForItem(selectedIndexPath); Element.IsDragAndDropping = true; Element.DragAndDropStartedCommand?.Execute( new DragAndDropInfo(from, -1, Element.BindingContext)); } break; case UIGestureRecognizerState.Changed: if (draggedViewCell == null) { return; } var gestureLocation = gesture.LocationInView(gesture.View); var changedPath = Control.IndexPathForItemAtPoint(gestureLocation); if (changedPath != null) { draggedViewCell = (iOSViewCell)Control.CellForItem(changedPath); if (draggedViewCell == null || (draggedViewCell.FormsCell is DraggableViewCell draggableViewCell && !draggableViewCell.IsDraggable)) { pathTo = null; // System.Diagnostics.Debug.WriteLine("Cancel change state"); return; } pathTo = changedPath; // System.Diagnostics.Debug.WriteLine($"State changed to {pathTo.Item}"); } switch (Element.DragAndDropDirection) { case DragAndDropDirection.HorizontalOnly: Control.UpdateInteractiveMovement(new CGPoint(gestureLocation.X, draggedViewCell.Center.Y)); break; case DragAndDropDirection.VerticalOnly: Control.UpdateInteractiveMovement(new CGPoint(draggedViewCell.Center.X, gestureLocation.Y)); break; default: Control.UpdateInteractiveMovement(gestureLocation); break; } break; case UIGestureRecognizerState.Ended: if (from < 0 || pathTo == null) { // System.Diagnostics.Debug.WriteLine($"Ended but cancelled cause incorrect parameters"); Control.CancelInteractiveMovement(); return; } var targetViewCell = (iOSViewCell)Control.CellForItem(pathTo); if (targetViewCell?.FormsCell is DraggableViewCell targetDraggableViewCell && !targetDraggableViewCell.IsDraggable) { // System.Diagnostics.Debug.WriteLine($"Ended but cancelled cause target is not draggable"); Control.CancelInteractiveMovement(); return; } // System.Diagnostics.Debug.WriteLine($"Ended from: {from} to: {pathTo.Item}"); Control.EndInteractiveMovement(); if (_itemsSource is IList itemsSourceList) { try { _isMovedBackfire = true; var item = itemsSourceList[from]; itemsSourceList.RemoveAt(from); itemsSourceList.Insert((int)pathTo.Item, item); var to = itemsSourceList.IndexOf(item); Element.IsDragAndDropping = false; if (draggedViewCell?.FormsCell is DraggableViewCell draggableViewCell) { draggableViewCell.IsDragAndDropping = false; Element.DragAndDropEndedCommand?.Execute( new DragAndDropInfo(from, to, draggableViewCell.BindingContext)); } draggedViewCell = null; } finally { _isMovedBackfire = false; } } break; default: Control.CancelInteractiveMovement(); break; } }
private void TrackGestureEnded(UIGestureRecognizerState state) { if (InteractionInProgress) { InteractionInProgress = false; if (!shouldCompleteTransition || state == UIGestureRecognizerState.Cancelled) { CancelInteractiveTransition (); } else { FinishInteractiveTransition (); } } }
GestureState UIStateToNodeState(UIGestureRecognizerState state) { switch (state) { case UIGestureRecognizerState.Began: return GestureState.Began; case UIGestureRecognizerState.Cancelled: return GestureState.Cancelled; case UIGestureRecognizerState.Changed: return GestureState.Update; case UIGestureRecognizerState.Ended: return GestureState.Ended; case UIGestureRecognizerState.Failed: return GestureState.Failed; case UIGestureRecognizerState.Possible: return GestureState.Possible; } return GestureState.Failed; }