Распознаватель длительного нажатия и касания для нескольких кнопок UIButton

У меня есть несколько кнопок в моем пользовательском интерфейсе, и я хочу выполнять разные функции в соответствии с разными типами кликов,

  • Один щелчок
  • Двойной клик
  • Длительное нажатие

Мне было легко сделать это для одного нажатия, IBAction со всеми четырьмя подключенными к нему кнопками, но для других типов щелчков я застрял,

Я понимаю, что мне нужно использовать распознаватель жестов касания, но я не могу настроить его на несколько UIButtons,

Вот и пример того, что я хочу сделать

import UIKit

class ViewController: UIViewController {


@IBOutlet weak var Label: UILabel!

override func viewDidLoad() {
    super.viewDidLoad()
    // Do any additional setup after loading the view, typically from a nib.
}

override func didReceiveMemoryWarning() {
    super.didReceiveMemoryWarning()
    // Dispose of any resources that can be recreated.
}


func ButtonSingleTap(sender:UIButton!) {

    let ButtonNumber: String = String(sender.tag)
    Label.text = "Button " + ButtonNumber + " is Single Tapped"
}


func ButtonDoubleTap(sender:UIButton!) {

    let ButtonNumber: String = String(sender.tag)
    Label.text = "Button " + ButtonNumber + " is Double Tapped"
}


func ButtonLongTap(sender:UIButton!) {

    let ButtonNumber: String = String(sender.tag)
    Label.text = "Button " + ButtonNumber + " is Long Pressed"
}
}

Интерфейс пользовательского интерфейса


person Sevan Malatjalian    schedule 28.10.2015    source источник


Ответы (1)


Вы не можете использовать один экземпляр UIGestureRecognizer для нескольких кнопок. Каждой кнопке нужен свой набор распознавателей жестов.

Вот пример, чтобы показать вам, как это сделать:

for button in [button1, button2, button3, button4] {
    let longPressRecognizer = UILongPressGestureRecognizer(target: self, action: Selector("didLongPress:"))
    let doubleTapRecognizer = UITapGestureRecognizer(target: self, action: Selector("didDoubleTap:"))
    doubleTapRecognizer.numberOfTapsRequired = 2
    button.addGestureRecognizer(longPressRecognizer)
    button.addGestureRecognizer(doubleTapRecognizer)
}

func didLongPress(recognizer: UILongPressGestureRecognizer) {
    guard let button = recognizer.view as? UIButton else { return }
    switch recognizer.state {
    case .Began:
        print("long press began button \(button.tag)")
    case .Ended:
        print("long press ended button \(button.tag)")
    default:
        break
    }
}

func didDoubleTap(recognizer: UITapGestureRecognizer) {
    guard let button = recognizer.view as? UIButton else { return }
    print("double tap button \(button.tag)")
}

Чтобы это работало, вам нужно добавить Outlets для ваших кнопок (button1, button2, button3, button4).

person joern    schedule 28.10.2015
comment
Добавление распознавателя жестов было в порядке, как я могу передать тег кнопки в функцию, которую я вызвал? - person Sevan Malatjalian; 29.10.2015
comment
Это сработало отлично, спасибо ... но не могли бы вы вкратце рассказать мне, что делает оператор guard let ? Ценю твою помощь - person Sevan Malatjalian; 29.10.2015
comment
Оператор Guard гарантирует, что объект, который пользователь коснулся или долго нажимал, имеет тип UIButton. В вашем случае это на самом деле не нужно, но если вы хотите получить доступ к свойству, которое определено только в UIButton (например, buttonType), вам нужно будет убедиться, что свойство view распознавателя действительно является UIButton, или вы получите ошибку компилятора . - person joern; 29.10.2015
comment
Спасибо! Это должен быть принятый ответ. Это напомнило мне о необходимости поместить объявление let UILongPressGestureRecognizer в оператор for. Спасибо! - person user4806509; 27.07.2016
comment
Спасибо! Я добавил жесты ко многим uibuttons с помощью viewWithTag(i), используя массив int вместо выходов, потому что длинные массивы выходов заставляют Xcode индексировать навсегда. - person theMouse; 01.04.2017