I d'like to combine a UILongPressGestureRecognizer with a UIPanGestureRecognizer.
The UIPanGestureRecognizer should start with a long press. Is there a simple way to do this? or do I really have to write my own gesture recognizer?
I wan't something like on the home screen. You press on an icon and after some time the icons start wobbling. Afterwards without releasing my finger from the screen I can start dragging the icon under my finger around.
I found a solution: This UIGestureRecognizerDelegate method does exactly what I looked for:
Andy B's approach in Swift,
Add the UIGestureRecognizerDelegate delegate to the class
Add a member variable
Add the gestures and need to add the pan gesture delegate to the VC. This is needed to fire off the shouldRecognizeSimultaneouslyWithGestureRecognizer and gestureRecognizerShouldBegin functions
Allow simultaneous gestures
Inside the long press handler:
Read the "Subclassing Notes" section of Apple's UIGestureRecognizer Class Reference at:
https://developer.apple.com/library/prerelease/tvos/documentation/UIKit/Reference/UIGestureRecognizer_Class/
I had a bit of a hard time for this problem. The accepted answer wasn't enough. No matter what I put in that method the pan or longpress handlers would get invoked. A solution I found was as follows:
UIGestureRecognizerDelegate
.Add the following delegate method to your class (as per the answer above):
Add the following delegate method to your class:
Then add either a property or ivar which will track if the pan should be allowed to begin (see method above). In my case
BOOL shouldAllowPan
.Set the BOOL to
NO
in yourinit
orviewDidLoad
. Inside your longPress handler set the BOOL toYES
. I do it like this:Inside the panHandler I do a check on the BOOL:
And finally reset the BOOL within the panHandler:
And then go grab a beer to congratulate yourself. ;)
actually, you don't have to combine gesture recognizers - you can do this solely with UILongPressGestureRecognizer... You enter StateBegan once your touch(es) have stayed within 'allowableMovement' for 'minimumPressDuration'. You stay in your continuous longPressGesture as long as you don't lift any of your fingers - so you can start moving your fingers and track the movement through StateChanged.
Long-press gestures are continuous. The gesture begins (UIGestureRecognizerStateBegan) when the number of allowable fingers (numberOfTouchesRequired) have been pressed for the specified period (minimumPressDuration) and the touches do not move beyond the allowable range of movement (allowableMovement). The gesture recognizer transitions to the Change state whenever a finger moves, and it ends (UIGestureRecognizerStateEnded) when any of the fingers are lifted.