tap gesture recognizer-какой объект был нажат?

Я новичок в распознавателях жестов, поэтому, возможно, этот вопрос звучит глупо: я назначаю распознаватели жестов tap куче 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];
    }

10 ответов


определите целевой селектор (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. 
}

Это был год, задавая этот вопрос, но все же для кого-то.

при объявлении 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
    }
}

вот обновление для Swift 3 и дополнение к ответу Мани. Я бы предложил использовать sender.view в сочетании с тегированием UIViews (или других элементов, в зависимости от того, что вы пытаетесь отслеживать) Для несколько более "продвинутого" подхода.

  1. добавление UITapGestureRecognizer, например, в UIButton (вы можете добавить это в UIViews и т. д. также) или целая куча элементов в массиве с for-loop и вторым массивом для крана жесты.
    let yourTapEvent = UITapGestureRecognizer(target: self, action: #selector(yourController.yourFunction)) 
    yourObject.addGestureRecognizer(yourTapEvent) // adding the gesture to your object
  1. определение функции в том же testController (это имя вашего контроллера представления). Мы собираемся использовать теги здесь - теги-это идентификаторы Int, которые вы можете добавить в свой UIView с помощью yourButton.tag = 1. Если у вас есть динамический список элементов, таких как массив, вы можете сделать for-loop, который повторяет Ваш массив и добавляет тег, который увеличивается постепенно

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

причина всех это связано с тем, что вы не можете передавать дополнительные аргументы для своей функции при ее использовании в сочетании с #selector.

если у вас есть еще более сложная структура пользовательского интерфейса, и вы хотите получить тег родителя элемента, прикрепленного к вашему жесту крана, вы можете использовать let yourAdvancedTag = sender.view!.superview?.tag например, получение тега UIView нажатой кнопки внутри этого UIView; может быть полезно для списков миниатюр + кнопок и т. д.


используйте этот код в 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                
        }
    }
}

можно использовать

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

view будет объектом, в котором жест крана был распознан


вы также можете использовать метод "shouldReceiveTouch" UIGestureRecognizer

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

Не забудьте установить делегат вашего распознавателя жестов.


в swift это довольно просто

напишите этот код в функции ViewDidLoad ()

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

часть обработчика это может быть в viewDidLoad или вне viewDidLoad, тесто помещается в расширение

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

здесь я просто проверяю код вывода если вы хотите сделать действие вы можете делать все что угодно или еще потренируйтесь и читайте


вы должны изменить создание распознавателя жестов, чтобы принять параметр (добавить двоеточие':')

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

и в методе highlightLetter: вы можете открыть панель прикреплена к устройства:

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

Если вы добавляете разные UIGestureRecognizer по-разному UIViews и хотите отличить в методе действия, то вы можете проверить представление свойства в параметре sender, который даст вам представление sender.


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
}