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 к нескольким представлениям, только последний просмотр работал.