iOS добавляет tapGesture к нескольким представлениям - PullRequest
17 голосов
/ 04 июня 2011

У меня есть несколько представлений, определенных в моем главном представлении.Я хочу добавить один жест касания ко всем этим представлениям.Ниже приведен код, который я написал, но он регистрирует жест касания для последнего добавленного представления.Таким образом, в приведенном ниже коде нажмите зарегистрирован только для messagesView и не для других просмотров.У меня есть 2 вопроса:

  1. Как мне зарегистрировать один и тот же tapGesture для нескольких видов?

  2. Допустим, я все заработал, теперь все по одномуотводы из этих представлений переходят к той же функции, которая называется oneTap.В этой функции, как я могу отличить, от какого вида идет сигнал?

Код:

@synthesize feedsView, peopleView, messagesView, photosView;

- (void)viewDidLoad
{
    [super viewDidLoad];

    UITapGestureRecognizer *singleTap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(oneTap:)];
    [singleTap setNumberOfTapsRequired:1];
    [singleTap setNumberOfTouchesRequired:1];
    [feedsView addGestureRecognizer:singleTap];
    [peopleView addGestureRecognizer:singleTap];
    [messagesView addGestureRecognizer:singleTap];
    //[photosView addGestureRecognizer:singleTap];
    [singleTap release];

    return;
}

Ответы [ 4 ]

25 голосов
/ 04 июня 2011

У меня была такая же проблема, когда она добавлялась только в последний вид.Возможно, есть лучшее решение, но я просто создал жест тега для каждого представления и связал их с одним и тем же методом селектора (oneTap: в вашем случае).Чтобы определить, какое представление активировало метод, вы можете просто пометить свои представления feedsView.tag = 0; peopleView.tag = 1; и так далее.Затем, когда метод вызывается:

- (void)oneTap:(UIGestureRecognizer *)gesture {
    int myViewTag = gesture.view.tag;  // now you know which view called
    // use myViewTag to specify individual actions;
}
12 голосов
/ 04 июня 2011
  1. Можно ли прикрепить UIGestureRecognizer к нескольким представлениям? Нет.

  2. Два варианта:

    а) Дайте каждому UIGestureRecognizer свое собственное действие. Плюсы этого подхода: сильная развязка. Минусы: больше повторного использования кода. Но вы можете уменьшить повторное использование кода, создав методы для общих функций и просто вызывая методы в различных действиях.

    b) Дайте каждому виду, к которому вы добавляете, UIGestureRecognizer уникальный тег. Затем используйте оператор switch в общем действии с тегом представления отправителя. Плюсы: меньше повторного использования кода. Недостатки: более плотное сцепление. Примерно так:

    UIGestureRecognizer *singleTap = [[UIGestureRecognizer alloc] initWithTarget:self action:@selector(singleTapAction:)];
    [feedsView addGestureRecognizer:singleTap];
    feedsView.tag = 33;
    

    Тогда:

    - (void)singleTapAction:(UIGestureRecognizer *)singleTap {
        UIView *view = singleTap.view;
        switch (view.tag) {
            case 33
                // view is feedsView
                break;
    
            default:
                break;
        }
    }
    

    Хотя обычно лучше использовать опцию, которая разъединяет, если все ваши действия очень похожи, что, кажется, имеет место здесь, и вы совершенно уверены, что они останутся очень похожими в будущем, тогда опция б) с тегами, вероятно, лучший выбор.

P.S. Нет необходимости явно устанавливать numberOfTapsRequired & numberOfTouchesRequired в 1, поскольку они оба установлены в 1 по умолчанию. Вы можете подтвердить это, удерживая Command и нажимая numberOfTapsRequired в Xcode.

3 голосов
/ 14 августа 2012

1 использовать hitTest:

CGPoint location = [singleTap locationInView:self.view];
id testView = [self.view hitTest:location withEvent:nil];

2 добавьте ОДИН TapGesture к нескольким видам, работал только последний вид.

2 голосов
/ 12 марта 2018

// Добавить жест касания в swift 4

    let tap = UITapGestureRecognizer(target: self, action: #selector(self.handleTap(_:)))
    view.addGestureRecognizer(tap)
    view.isUserInteractionEnabled = true
    self.view.addSubview(view)

// function which is triggered when handleTap is called
@objc func handleTap(_ sender: UITapGestureRecognizer) {
    if sender.view == view1 {
       // do something
    }
    else{
       // do next thing
    }
}

// ИСПОЛЬЗОВАНИЕ в представлении загрузило: tapGestures (view: view1) tapGestures (view: view2) tapGestures (view: view3)

...