コード例 #1
0
        /// <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
        }
コード例 #2
0
        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();
            }
        }
コード例 #3
0
        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;
            }
        }
コード例 #4
0
 public DragDropEventArgs(UIGestureRecognizerState state, CGPoint point, CGPoint delta, CGPoint viewWasAt)
 {
     State     = state;
     Point     = point;
     Delta     = delta;
     ViewWasAt = viewWasAt;
 }
コード例 #5
0
        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;
            }
        }
コード例 #6
0
        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);
        }
コード例 #7
0
        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;
            }
        }
コード例 #8
0
        /// <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
        }
コード例 #9
0
        private void TrackGestureEnded(UIGestureRecognizerState state)
        {
            if (InteractionInProgress)
            {
                InteractionInProgress = false;

                if (!shouldCompleteTransition || state == UIGestureRecognizerState.Cancelled)
                {
                    CancelInteractiveTransition();
                }
                else
                {
                    FinishInteractiveTransition();
                }
            }
        }
コード例 #10
0
        /// <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
            }
        }
コード例 #11
0
        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;
            }
        }
コード例 #12
0
        /// <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;
            }
        }
コード例 #13
0
        /// <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;
            }
        }
コード例 #14
0
        /// <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
        }
コード例 #15
0
        /// <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;
            }
        }
コード例 #16
0
        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;
            }
        }
コード例 #17
0
        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;
            }
        }
コード例 #18
0
ファイル: NodeUIView.cs プロジェクト: nagyistge/Canvas
        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 ();
                }
            }
        }
コード例 #21
0
ファイル: NodeUIView.cs プロジェクト: Clancey/Canvas
 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;
 }