Sometimes you may want to distinguish between a quick tap and a long press on a
UIBarButtonItem. Many iOS document-based apps, for example, contain an Undo button that undos the last action when tapped quickly and displays an undo/redo menu when long-pressed. Since
UIBarButtonItem doesn’t inherit from
UIView or expose the item’s underlying view, this isn’t as easy as adding a gesture recognizer.
What many people don’t realize is that their
IBActions can actually be passed a second parameter containing the
UIEvent triggering the action. For example, instead of defining:
we can define:
Now when the bar button is tapped, we’ll get sent the event that triggered the tap.
From here, we can access the first touch:
And then we can ask for its tap count. This value will be
1 for quick, single taps, and
0 for long presses that are around 1 second or longer.
While not obvious, that’s all it takes to quickly detect a long press on a