你能够将UIGestureRecognizer附加到多个视图上吗?

256
UITapGestureRecognizer *tapGesture = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(tapTapTap:)];
[self.view1 addGestureRecognizer:tapGesture];
[self.view2 addGestureRecognizer:tapGesture];
[tapGesture release];

在上面的代码中,只有对view2的点击被识别。如果我注释掉第三行,则可以识别对view1的点击。如果我正确,只能使用一次手势识别器,那么我不确定这是一个错误还是需要更多的文档说明。

13个回答

1
我知道这是一个旧帖子,但我发现类似的东西,希望对其他人有用。我只是将我的imageView存储在一个数组中,并在一个函数中将其分配给相同的手势识别器,以设置每个imageView。
在我的viewDidLoad()中:
imageViewList = [imageView, imageView2, imageView3]
setupImageViews(imageViews: imageViewList)

设置图像视图的函数:

func setupImageViews(imageViews: [UIImageView]) {
    
    for imageView in imageViews {
        let tapGestureRecognizer = UITapGestureRecognizer(target: self, action: #selector(imageTapped(tapGestureRecognizer:)))
        imageView.isUserInteractionEnabled = true
        imageView.addGestureRecognizer(tapGestureRecognizer)
        
        //set up image to be displayed with the right aspect
        imageView.autoresizingMask = [.flexibleWidth, .flexibleHeight, .flexibleBottomMargin, .flexibleRightMargin, .flexibleLeftMargin, .flexibleTopMargin]
        imageView.contentMode = .scaleAspectFit // OR .scaleAspectFill
        imageView.clipsToBounds = true
    }
}

在action selector的imageTapped()方法中,您可以为每个被点击的图片视图编写相应的代码。
@objc func imageTapped(tapGestureRecognizer: UITapGestureRecognizer)
{
    switch tapGestureRecognizer.view {
    case imageView:
        print("tapped Image View 1") //add your actions here
    case imageView2:
        print("tapped Image View 2") //add your actions here
    case imageView3:
        print("tapped Image View 3") //add your actions here
    default:
        print("Tap not detected")
    }
    _ = tapGestureRecognizer.view as! UIImageView
    //additional code...
}

2
那不是同一个手势识别器。在你的示例中,你为每个UIImageView初始化了一个新的手势识别器。 - duraz0rz
当我将触摸手势识别器的初始化移出循环,这样只有一个时,就不会出现错误,但是手势识别器只被添加到数组中的最后一个视图中,前三个(在我的情况下)在点击时没有任何反应。 - Dominick
您正在创建新的UITapGestureRecognizer实例。 - Akhtar

-2
要在Swift中为多个视图添加轻拍手势,您可以使用循环来遍历这些视图,并将手势识别器添加到每个视图中。以下是一个示例:
let views = [view1, view2, view3, view4]
        views.forEach { view in
            let tap = UITapGestureRecognizer(target: self, action: #selector(self.handleTap(_:)))
            view.isUserInteractionEnabled = true
            view.addGestureRecognizer(tap)
        }
    }
    
    @objc func handleTap(_ sender: UITapGestureRecognizer? = nil) {
        switch sender?.view {
        case view1:
            //do something
        case view2:
            //do something
        default:
            break
        }
    }

1
已经有多个答案展示了如何使用循环向每个视图添加唯一的手势。 - HangarRash

-7

你可以使用这段代码,在xib中的我的视图(imageviews)上实现它。

- (void)viewDidLoad
{
    firstIV.tag = 501;
    secondIV.tag = 502;
    thirdIV.tag = 503;
    forthIV.tag = 504;

    [self addTapGesturetoImageView: firstIV];
    [self addTapGesturetoImageView: secondIV];
    [self addTapGesturetoImageView: thirdIV];
    [self addTapGesturetoImageView: forthIV];
}

-(void)addTapGesturetoImageView:(UIImageView*)iv
{
    iv.userInteractionEnabled = YES;
    UITapGestureRecognizer * textfielBGIVTapGasture = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(textfielBGIVTapped:)];
    textfielBGIVTapGasture.numberOfTapsRequired = 1;
    [iv addGestureRecognizer:textfielBGIVTapGasture];
}

- (void)textfielBGIVTapped:(UITapGestureRecognizer *)recognizer {
    int tag = recognizer.view.tag-500;
    switch (tag) {
        case 1:
        {
            //firstIV tapped;
            break;
        }
        case 2:
        {
            //secondIV tapped;
            break;
        }
        case 3:
        {
            //thirdIV tapped;
            break;
        }
        case 4:
        {
            //forthIV tapped;
            break;
        }
        default: {
            break;
        }
    }
}

1
您正在创建多个手势识别器;我的原始问题是关于重用单个手势识别器的,这是不可能的。 - kubi
1
500 添加到所有视图标签中,然后再减去 500 的目的是什么?为什么不直接从 1(甚至 0)开始标记,而要从 501 开始呢? - ma11hew28
@MattDiPasquale,你可以从1开始,这并不重要,因为我是从我的应用程序中复制了这段代码,我在那里将其设置为501。但是,请不要使用0,因为我曾经在某个地方读到过它总是指示父视图,所以会产生复杂性,相信我,我已经面对过这个问题。 - Dilip Manek
文档中的关键文本是“视图与手势识别器建立了强引用关系。”这意味着视图拥有手势。手势只能有一个所有者。请参见链接 - Phantom59

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接