从绑定到多个 UIButtons 的 GestureRecognizer 获取发件人信息

Get Sender info from GestureRecognizer tied to multi UIButtons

所以我有一个 UILongPressGestureRecognizer 连接到

@IBAction func PresentPlayerInfo(sender: UIGestureRecognizer){
    if let button = sender.view as? UIButton {
        buttonSourceFrame = button.frame.origin}
    performSegueWithIdentifier("PVC", sender: self)
}

buttonSourceFrame 然后传递给 prepareForSegue

中的下一个 ViewController

我想将这个 1 UILongPressGestureRecognizer 连接到多个 UIButton,这样我就不必为每个 UIButton 创建一个 UILongPressGestureRecognizer

但是当我将多个 UIButton 连接到一个 gestureRecognizer 时...无论我按哪个按钮,转场都很好,但是传递的 CGPoint 总是那个UIButton 位于列表的顶部(这里是 3),而不是 UIButton 按下的 CGPoint

enter image description here

是否可以将 GestureRecognizer 连接到多个 UIButton 并仍然获得发件人信息...或者我是否必须每个创建一个 GestureRecognizer UIButton?

A gestureRecognizer 只有一个 view 属性,记录在案 here。通常为每个要识别手势的 UI 元素创建一个单独的元素。如果你想创建一个识别器然后计算出哪个按钮被按下,你需要将识别器附加到包含所有按钮的单个视图,然后计算出按下的位置(比如)locationInView,考虑到任何自动布局更改的影响。就个人而言,我只会创建所有单独的识别器。

将手势识别器连接到 viewController 的主视图。然后,在您的 @IBAction 中,您必须确定被点击的视图:

@IBAction func PresentPlayerInfo(sender: UIGestureRecognizer){
    var tappedView: UIView?
    var loc = sender.locationInView(self.view)  // self.view is the parent view of the buttons

    if (CGRectContainsPoint(self.button1.frame, loc)) {
        tappedView = self.button1
    }
    else if (CGRectContainsPoint(self.button2.frame, loc)) {
        tappedView = self.button2
    }


    performSegueWithIdentifier("PVC", sender: tappedView)
}