Подтвердить что ты не робот

TouchUpInside на UIView с детьми

Возможно, я здесь что-то пропустил, но...

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

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

4b9b3361

Ответ 1

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

Удачи!

EDIT: здесь шаг за шагом со снимками экрана:

Вид... Original view - of type UIView

... конечно, никаких событий. UIView has no events you can use

Вернитесь назад и измените UIView с помощью UIControl и... Change UIView to UIControl

Ta-даа! Мероприятия! UIControl allows you to use events

Подключить метод к событию UITouchUpInside Add event for UITouchUpInside

Вот как это должно выглядеть в файле интерфейса The interface of the method

Вот как это должно выглядеть в файле реализации (вы, конечно, можете заменить регистрацию тем, что хотите) The implementation of the method

Ответ 2

Вы можете симулировать это поведение, имея распознаватель жестов для своего родительского представления и гарантируя, что ваши дети не имеют собственных распознавателей жестов. Для этого добавьте распознаватель жестов к вашему родителю UIView, который прослушивает краны. Где parentView - это содержащий представление для ваших дочерних представлений (UILabels/UIImageView) и handleTap - это метод, реализованный parentView, выполните следующее:

UIGestureRecognizer *tapParent = [[UITapGestureRecognizer alloc]initWithTarget:parentView action:@selector(handleTap)];
[parentView addGestureRecognizer:tapParent];
[tapParent release];

Поскольку у ваших представлений вашего ребенка нет собственных распознавателей жестов, они не будут "есть" жест, и поэтому родительское представление будет отвечать до тех пор, пока вы коснетесь его границ.

Ответ 3

вам нужно дать более подробную информацию, потому что есть несколько вариантов.

Если вы хотите использовать обычный кран, вы можете поймать одно из стандартных событий касания и посмотреть, какое субподключение получило событие. Что-то вроде этого:

-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
    UITouch *touch = [touches anyObject];
    if(touch.view != self.mySubViewOfInterest)
    {
        // perform my actions
    }
}

Если вам требуется сложное распознавание жестов, вы можете использовать один из UIGestureRecognizer и назначить его для просмотра или основного представления.

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

Ответ 4

Это работает для меня

Swift 3

 let gesture = UITapGestureRecognizer(target: self, action: selector(self.customViewClick))
withSender: self)
 customView.addGestureRecognizer(gesture)


 func customViewClick()  {
     print("custom view clicked!")
    }