Подтвердить что ты не робот

Косвенный распознаватель жестов - какой объект был использован?

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

Ответ 1

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

Ответ 2

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

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

Ответ 3

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

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

    func yourFunction(_ sender: AnyObject) {
        let yourTag = sender.view!.tag // this is the tag of your gesture 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; может быть полезно для миниатюр + списков кнопок и т.д.

Ответ 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                
        }
    }
}

Ответ 5

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

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

view будет Объект, в котором распознан признак касания

Ответ 6

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

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

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

Ответ 7

быстро, это довольно просто

Введите этот код в функции 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"
} 

здесь я просто тестирую код, печатая вывод если вы хотите сделать действие, вы можете делать все, что хотите или больше практики и читать

Ответ 8

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

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

И в вашем методе highlightLetter: вы можете получить доступ к представлению, прикрепленному к распознавателю:

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

Ответ 9

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

Ответ 10

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

Типичный пример 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)")

Теперь вы знаете, "какое" лицо было нажато в вашей таблице, на экране, в виде стека и т.д.

Это так просто.