【问题标题】:Long Press & Tap Recognizer for multiple UIButtons多个 UIButtons 的长按和点击识别器
【发布时间】:2015-10-28 09:47:46
【问题描述】:

我的用户界面上有多个按钮,我想根据不同的点击类型执行不同的功能,

  • 单击
  • 双击
  • 长按

单击一次对我来说很容易,一个连接了所有四个按钮的 IBAction,但对于其他类型的点击,我被卡住了,

我知道我需要使用点击手势识别器,但我无法将其设置为多个 UIButton,

这是我想做的例子

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"
}
}

【问题讨论】:

    标签: uibutton swift2 xcode7 uitapgesturerecognizer uilongpressgesturerecogni


    【解决方案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(button1button2button3button4)。

    【讨论】:

    • 添加手势识别器没问题,我怎样才能将按钮标签传递给我调用的函数?
    • 它工作得很好,谢谢......但是你能简单地告诉我 guard let 语句是做什么的吗?感谢您的帮助
    • guard 语句确保用户点击/长按的对象是UIButton 类型。在您的情况下,它并不是真正需要的,但是如果您想访问仅在 UIButton 中定义的属性(如 buttonType),您必须确保识别器的 view 属性确实是 UIButton否则你会得到一个编译器错误。
    • 谢谢!这应该是公认的答案。它提醒我将 let UILongPressGestureRecognizer 声明放在 for 语句中。谢谢!
    • 谢谢!我使用 int 数组将手势添加到许多带有 viewWithTag(i) 的 uibuttons,而不是 outlet,因为长的 outlet 数组使 Xcode 永远进入索引。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多