TouchUpInside на UIView с детьми

Я могу что-то здесь упустить, но...

у меня есть UIView с несколькими детьми (пара UILabelи UIImageView). Мне нужно поймать событие, когда пользователь щелкает (нажимает) в любом месте в родительском UIView - видимая часть UIView или любой из его детей).

Какой лучший способ сделать это?

4 ответа

Решение

Вы можете изменить класс UIView в Identity Inspector... сделать это UIControl а затем вы можете добавить событие для UITouchUpInside на ваш взгляд - поймать на нем метчики.

Удачи!

РЕДАКТИРОВАТЬ: вот шаг за шагом со скриншотами:

Вид...Исходный вид - типа UIView

... конечно, нет событий.У UIView нет событий, которые вы можете использовать

Вернитесь и измените UIView с UIControl и...Изменить UIView на UIControl

Ta-даа! События!UIControl позволяет использовать события

Подключите метод к событию UITouchUpInsideДобавить событие для 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) {

    }
Другие вопросы по тегам