ios - Swift: Long Press Gesture Recognizer - Detect taps and Long Press

ID : 131316

viewed : 8

Tags : iosswiftlong-pressios

Top 5 Answer for ios - Swift: Long Press Gesture Recognizer - Detect taps and Long Press

vote vote

97

Define two IBActions and set one Gesture Recognizer to each of them. This way you can perform two different actions for each gesture.

You can set each Gesture Recognizer to different IBActions in the interface builder.

@IBAction func tapped(sender: UITapGestureRecognizer) {     println("tapped")     //Your animation code. }  @IBAction func longPressed(sender: UILongPressGestureRecognizer) {     println("longpressed")     //Different code } 

Through code without interface builder

let tapGestureRecognizer = UITapGestureRecognizer(target: self, action: "tapped:")     self.view.addGestureRecognizer(tapGestureRecognizer)      let longPressRecognizer = UILongPressGestureRecognizer(target: self, action: "longPressed:")     self.view.addGestureRecognizer(longPressRecognizer)  func tapped(sender: UITapGestureRecognizer) {     println("tapped") }  func longPressed(sender: UILongPressGestureRecognizer) {     println("longpressed") } 

Swift 5

let tapGestureRecognizer = UITapGestureRecognizer(target: self, action: #selector(tapped)) self.view.addGestureRecognizer(tapGestureRecognizer)      let longPressRecognizer = UILongPressGestureRecognizer(target: self, action: #selector(longPressed)) self.view.addGestureRecognizer(longPressRecognizer)      @objc func tapped(sender: UITapGestureRecognizer){     print("tapped") }  @objc func longPressed(sender: UILongPressGestureRecognizer) {     print("longpressed") } 
vote vote

83

For swift2

let lpgr = UILongPressGestureRecognizer(target: self, action: #selector(handleLongPress)) lpgr.minimumPressDuration = 0.5 lpgr.delaysTouchesBegan = true lpgr.delegate = self self.featuredCouponColView.addGestureRecognizer(lpgr) 

Action

//MARK: - UILongPressGestureRecognizer Action -     func handleLongPress(gestureReconizer: UILongPressGestureRecognizer) {         if gestureReconizer.state != UIGestureRecognizerState.Ended {             //When lognpress is start or running         }         else {             //When lognpress is finish         }     } 

For Swift 4.2/ Swift 5

let lpgr = UILongPressGestureRecognizer(target: self, action: #selector(handleLongPress)) lpgr.minimumPressDuration = 0.5 lpgr.delaysTouchesBegan = true lpgr.delegate = self self.colVw.addGestureRecognizer(lpgr)  //MARK: - UILongPressGestureRecognizer Action -     @objc func handleLongPress(gestureReconizer: UILongPressGestureRecognizer) {         if gestureReconizer.state != UIGestureRecognizer.State.ended {             //When lognpress is start or running         }         else {             //When lognpress is finish         }     } 
vote vote

76

Through code without interface builder

// Global variables declaration var longPressed = false var selectedRow = 0    override func viewDidLoad() {         super.viewDidLoad()           let longPressGesture = UILongPressGestureRecognizer(target: self, action: #selector(ContactListTableViewController.handleLongPress(_:)))         longPressGesture.minimumPressDuration = 1.0 // 1 second press         longPressGesture.allowableMovement = 15 // 15 points         longPressGesture.delegate = self         self.tableView.addGestureRecognizer(longPressGesture)     }  // Long tap work goes here !! if (longPressed == true) {         if(tableView.cellForRowAtIndexPath(indexPath)?.accessoryType == .Checkmark){                 tableView.cellForRowAtIndexPath(indexPath)?.accessoryType = .None                 self.selectedRow -= 1                  if(self.selectedRow == 0){                     self.longPressed = false                 }              } else {                 self.selectedRow += 1                 tableView.cellForRowAtIndexPath(indexPath)?.accessoryType = .Checkmark             }          } else if(self.selectedRow == 0) {           // Single tape work goes here !!         } 

But the only problem is the long press gesture runs two times. If you have found any solution do comment below !

vote vote

63

Swift 5 using interface builder

for the normal tap you can simply create a touch up inside action from your button.

for the long press, create an outlet for your button, create the tap gesture recognizer and set it to the button then create the selector method to perform the long press tasks.

@IBOutlet var myButton: UIButton!  override func viewDidLoad() {     super.viewDidLoad()          let longPressRecognizer = UILongPressGestureRecognizer(target: self, action: #selector(addToListButtonLongPress(_:)))     longPressRecognizer.numberOfTouchesRequired = 1     longPressRecognizer.allowableMovement = 10     longPressRecognizer.minimumPressDuration = 0.5     myButton.addGestureRecognizer(longPressRecognizer) }  // Connected to myButton in interface builder. @IBAction func myButtonTapped(_ sender: UIButton) {     print("button tapped") }  @objc func myButtonLongPressed(_ sender: UILongPressGestureRecognizer) {     print("button long pressed") } 
vote vote

51

Top 3 video Explaining ios - Swift: Long Press Gesture Recognizer - Detect taps and Long Press

Related QUESTION?