TouchUpInside на UIView с детьми
Я могу что-то здесь упустить, но...
у меня есть UIView
с несколькими детьми (пара UILabel
и UIImageView
). Мне нужно поймать событие, когда пользователь щелкает (нажимает) в любом месте в родительском UIView
- видимая часть UIView
или любой из его детей).
Какой лучший способ сделать это?
4 ответа
Вы можете изменить класс UIView в Identity Inspector... сделать это UIControl
а затем вы можете добавить событие для UITouchUpInside
на ваш взгляд - поймать на нем метчики.
Удачи!
РЕДАКТИРОВАТЬ: вот шаг за шагом со скриншотами:
Вид...
... конечно, нет событий.
Вернитесь и измените UIView с UIControl и...
Ta-даа! События!
Подключите метод к событию UITouchUpInside
Вот так это должно выглядеть в файле интерфейса
Вот как это должно выглядеть в файле реализации (вы можете, конечно, заменить запись на что угодно)
Вы можете симулировать это поведение, имея распознаватель жестов для родительского представления и убедившись, что у ваших детей нет собственных распознавателей жестов. Для этого добавьте распознаватель жестов к вашему родителю. UIView
который слушает прослушивания. куда parentView
является содержащим представлением для ваших дочерних представлений (UILabels
/UIImageView
) а также handleTap
это метод, реализованный parentView
, сделайте что-то вроде:
UIGestureRecognizer *tapParent = [[UITapGestureRecognizer alloc]initWithTarget:parentView action:@selector(handleTap)];
[parentView addGestureRecognizer:tapParent];
[tapParent release];
Поскольку у ваших дочерних представлений нет собственных распознавателей жестов, они не будут "съедать" этот жест, и поэтому родительское представление будет реагировать, пока вы нажимаете в его пределах.
Это работает для меня
Свифт 3
let gesture = UITapGestureRecognizer(target: self, action: selector(self.customViewClick))
withSender: self)
customView.addGestureRecognizer(gesture)
func customViewClick() {
print("custom view clicked!")
}
Вы должны дать немного больше деталей, потому что есть несколько вариантов.
Если вы хотите обычное касание, вы можете поймать одно из стандартных событий касания и посмотреть, какое подпредставление получило событие. Что-то вроде этого:
-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
UITouch *touch = [touches anyObject];
if(touch.view != self.mySubViewOfInterest)
{
// perform my actions
}
}
Если вам нужно сложное распознавание жестов, вы можете использовать один из UIGestureRecognizer и назначить его для подпредставлений или основного представления.
В любом случае, вы должны обратить внимание, что все подпредставления (те, которые вы хотите, чтобы они перехватили событие) должны были включать взаимодействие с пользователем, в противном случае ваш основной вид будет также захватывать события для подпредставлений, и вы в конечном итоге будете отлаживать и отлаживать, не понимая, что это происходит.
Свифт 4:
let clickGesture = UITapGestureRecognizer(target: self, action: #selector(self.onUiViewClick))
uiView.addGestureRecognizer(clickGesture)
@objc func onUiViewClick(sender : UITapGestureRecognizer) {
}