点击手势识别器 - 哪个对象被点击?

时间:2014-02-05 09:20:09

标签: ios objective-c uigesturerecognizer uitapgesturerecognizer

我是手势识别器的新手所以也许这个问题听起来很愚蠢:我正在为一堆UIViews分配轻拍手势识别器。在这个方法中是否有可能找出以某种方式点击它们或者我是否需要使用点击屏幕上的点找到它?

for (NSUInteger i=0; i<42; i++) {
        float xMultiplier=(i)%6;
        float yMultiplier= (i)/6;
        float xPos=xMultiplier*imageWidth;
        float yPos=1+UA_TOP_WHITE+UA_TOP_BAR_HEIGHT+yMultiplier*imageHeight;
        UIView *greyRect=[[UIView alloc]initWithFrame:CGRectMake(xPos, yPos, imageWidth, imageHeight)];
        [greyRect setBackgroundColor:UA_NAV_CTRL_COLOR];

        greyRect.layer.borderColor=[UA_NAV_BAR_COLOR CGColor];
        greyRect.layer.borderWidth=1.0f;
        greyRect.userInteractionEnabled=YES;
        [greyGridArray addObject:greyRect];
        [self.view addSubview:greyRect];
        NSLog(@"greyGrid: %i: %@", i, greyRect);

        //make them touchable
        UITapGestureRecognizer *letterTapRecognizer = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(highlightLetter)];
        letterTapRecognizer.numberOfTapsRequired = 1;
        [greyRect addGestureRecognizer:letterTapRecognizer];
    }

12 个答案:

答案 0 :(得分:109)

使用参数

定义目标选择器(highlightLetter:
UITapGestureRecognizer *letterTapRecognizer = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(highlightLetter:)];

然后你可以通过

获得视图
- (void)highlightLetter:(UITapGestureRecognizer*)sender {
     UIView *view = sender.view; 
     NSLog(@"%d", view.tag);//By tag, you can find out where you had tapped. 
}

答案 1 :(得分:15)

一年来一直在问这个问题,但仍然是某人。

在特定视图上声明UITapGestureRecognizer时,将标记指定为

UITapGestureRecognizer *tapRecognizer = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(gestureHandlerMethod:)];
[yourGestureEnableView addGestureRecognizer:tapRecognizer];
yourGestureEnableView.tag=2;

并在您的处理程序中执行此操作

-(void)gestureHandlerMethod:(UITapGestureRecognizer*)sender {
    if(sender.view.tag == 2) {
        // do something here
    }
}

答案 2 :(得分:7)

以下是 Swift 3 的更新,以及对Mani的回答的补充。我建议将sender.view与标记UIViews(或其他元素,取决于您要跟踪的内容)结合使用,以获得更高级别的&#34;高级&#34;方法

  1. 将UITapGestureRecognizer添加到例如一个UIButton(您也可以将它添加到UIViews等)或者一组数组中的项目,其中包含for循环和第二个用于轻击手势的数组。
  2.     let yourTapEvent = UITapGestureRecognizer(target: self, action: #selector(yourController.yourFunction)) 
        yourObject.addGestureRecognizer(yourTapEvent) // adding the gesture to your object
    
    1. 在同一个testController中定义该函数(它是View Controller的名称)。我们将在这里使用tags - 标签是Int ID,您可以使用yourButton.tag = 1将其添加到您的UIView中。如果你有一个像数组一样的动态元素列表,你可以创建一个for循环,它遍历你的数组并添加一个标签,它会逐渐增加

      func yourFunction(_ sender: AnyObject) {
          let yourTag = sender.view!.tag // this is the tag of your gesture's object
          // do whatever you want from here :) e.g. if you have an array of buttons instead of just 1:
          for button in buttonsArray {
            if(button.tag == yourTag) {
              // do something with your button
            }
          }
      }
      
    2. 所有这一切的原因是因为当与#selector一起使用时,你不能为你的函数传递更多的参数。

      如果您的UI结构更加复杂,并且您希望获得附加到点击手势的项目的父标记,则可以使用let yourAdvancedTag = sender.view!.superview?.tag,例如在UIView中获取按下按钮的UIView标签;可用于缩略图+按钮列表等。

答案 3 :(得分:4)

在Swift中使用此代码

func tappGeastureAction(sender: AnyObject) {
    if let tap = sender as? UITapGestureRecognizer {
        let point = tap.locationInView(locatedView)
        if filterView.pointInside(point, withEvent: nil) == true {
            // write your stuff here                
        }
    }
}

答案 4 :(得分:2)

你可以使用

 - (void)highlightLetter:(UITapGestureRecognizer*)sender {
     UIView *view = sender.view; 
     NSLog(@"%d", view.tag); 
}

视图将是识别轻击手势的对象

答案 5 :(得分:2)

您还可以使用UIGestureRecognizer的“shouldReceiveTouch”方法

- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:     (UITouch *)touch {
     UIView *view = touch.view; 
     NSLog(@"%d", view.tag); 
}    

别忘了设置手势识别器的代理。

答案 6 :(得分:2)

在swift中非常简单

在ViewDidLoad()函数中编写此代码

let tap = UITapGestureRecognizer(target: self, action: #selector(tapHandler(gesture:)))
    tap.numberOfTapsRequired = 2
    tapView.addGestureRecognizer(tap)

处理程序部分可以在viewDidLoad中或在viewDidLoad之外,batter放在扩展名

@objc func tapHandler(gesture: UITapGestureRecognizer) {
    currentGestureStates.text = "Double Tap"
} 

这里我只是通过打印输出来测试代码 如果你想做一个动作,你可以做任何你想做的事 或更多练习和阅读

答案 7 :(得分:1)

您应该修改手势识别器的创建以接受参数(添加冒号':')

UITapGestureRecognizer *letterTapRecognizer = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(highlightLetter:)];

在您的方法highlightLetter中:您可以访问附加到识别器的视图:

-(IBAction) highlightLetter:(UITapGestureRecognizer*)recognizer
{
    UIView *view = [recognizer view];
}

答案 8 :(得分:1)

典型的2019年示例

假设您有一个FaceView,它是某种图像。您将在屏幕上(或在集合视图,表,堆栈视图或其他列表中)有许多

FaceView类中,您将需要一个变量“ index”

class FaceView: UIView {
   var index: Int

以便每个FaceView可以自我感知屏幕上的“哪张”面孔。

因此,您必须将var index: Int添加到相关课程。

因此您要在屏幕上添加许多FaceView ...

let f = FaceView()
f.index = 73
.. you add f to your stack view, screen, or whatever.

您现在将点击添加到f

p.addGestureRecognizer(UITapGestureRecognizer(target: self,
                           action: #selector(tapOneOfTheFaces)))

这是秘密:

@objc func tapOneOfTheFaces(_ sender: UITapGestureRecognizer) {
    if let tapped = sender.view as? CirclePerson {
        print("we got it: \(tapped.index)")

您现在知道在表,屏幕,堆栈视图或其他任何内容中单击了“哪个”面。

就这么简单。

答案 9 :(得分:0)

如果要在不同的UIGestureRecognizer上添加不同的UIView并希望在操作方法中进行区分,则可以在sender参数中检查属性视图,该视图将为您提供发件人视图。

答案 10 :(得分:0)

func tabGesture_Call
{
     let tapRec = UITapGestureRecognizer(target: self, action: "handleTap:")
     tapRec.delegate = self
     self.view.addGestureRecognizer(tapRec)
     //where we want to gesture like: view, label etc
}

func handleTap(sender: UITapGestureRecognizer) 
{
     NSLog("Touch..");
     //handling code
}

答案 11 :(得分:0)

快捷键5

对于我来说,我需要访问被单击的UILabel,因此您可以在手势识别器中进行操作。

let label:UILabel = gesture.view as! UILabel

gesture.view属性包含单击内容的视图,您可以将其向下转换为您所知道的内容。

@IBAction func tapLabel(gesture: UITapGestureRecognizer) {

        let label:UILabel = gesture.view as! UILabel

        guard let text = label.attributedText?.string else {
            return
        }

        print(text)
}

因此,您可以对tapLabel函数执行类似的操作,并在viewDidLoad中放置...

<Label>.addGestureRecognizer(UITapGestureRecognizer(target:self, action: #selector(tapLabel(gesture:))))

只需将<Label>替换为您的实际标签名称