IOS добавляет tapGesture к нескольким представлениям

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

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

  • Предположим, что я получаю эту работу, теперь все однократные отрывки из этих представлений переходят к той же функции, что и 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;
}

Ответы

Ответ 1

У меня была такая же проблема, когда она добавилась только к последнему виду. Возможно, было лучшее решение, но я просто создал жест тегов для каждого представления и связал их с одним и тем же методом выбора (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;
}

Ответ 2

  • Можете ли вы подключить UIGestureRecognizer к нескольким представлениям? Нет.

  • Два варианта:

    a) Дайте каждому 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;
        }
    }
    

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

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

Ответ 3

1 используйте hitTest:

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

2 добавьте Single TapGesture к нескольким представлениям, только последний просмотр работал.