web-dev-qa-db-fra.com

UIButton avec une presse unique et une presse longue rapide

Je veux déclencher deux actions sur button click et button long click. J'ai ajouté une UIbutton dans mon constructeur d'interface. Comment puis-je déclencher deux actions en utilisant IBAction, quelqu'un peut-il me dire comment archiver cela?

c'est le code que j'ai utilisé pour un clic de bouton 

@IBAction func buttonPressed (sender: UIButton) { .... }

puis-je utiliser cette méthode ou dois-je utiliser une autre méthode pour un clic long?

11
Kamal Upasena

Si vous souhaitez effectuer une action simplement en appuyant dessus et en maintenant appuyé, vous pouvez ajouter des gestes dans le bouton de cette façon:

@IBOutlet weak var btn: UIButton!

override func viewDidLoad() {

    let tapGesture = UITapGestureRecognizer(target: self, #selector (tap))  //Tap function will call when user tap on button
    let longGesture = UILongPressGestureRecognizer(target: self, #selector(long))  //Long function will call when user long press on button.
    tapGesture.numberOfTapsRequired = 1
    btn.addGestureRecognizer(tapGesture)
    btn.addGestureRecognizer(longGesture)
}

@objc func tap() {

    print("Tap happend")
}

@objc func long() {

    print("Long press")
}

De cette façon, vous pouvez ajouter plusieurs méthodes pour un seul bouton et vous avez simplement besoin de Outlet pour ce bouton.

27
Dharmesh
@IBOutlet weak var countButton: UIButton!
override func viewDidLoad() {
    super.viewDidLoad()

    addLongPressGesture()
}
@IBAction func countAction(_ sender: UIButton) {
    print("Single Tap")
}

@objc func longPress(gesture: UILongPressGestureRecognizer) {
    if gesture.state == UIGestureRecognizerState.began {
        print("Long Press")
    }
}

func addLongPressGesture(){
    let longPress = UILongPressGestureRecognizer(target: self, action: #selector(longPress(gesture:)))
    longPress.minimumPressDuration = 1.5
    self.countButton.addGestureRecognizer(longPress)
}
3
Murad Al Wajed

Pourquoi ne pas créer une classe UIButton personnalisée, créer un protocole et laisser le bouton renvoyer les informations à delegte. Quelque chose comme ça: 

    //create your button using a factory (it'll be easier of course)
    //For example you could have a variable in the custom class to have a unique identifier, or just use the tag property)

    func createButtonWithInfo(buttonInfo: [String: Any]) -> CustomUIButton {
        let button = UIButton(type: .custom)
        button.tapDelegate = self
        /*
Add gesture recognizers to the button as well as any other info in the buttonInfo

*/
        return button
    }

    func buttonDelegateReceivedTapGestureRecognizerFrom(button: CustomUIButton){
        //Whatever you want to do
    }
0
Septronic