TouchUpInside на UIView с детьми

возможно, я что-то упускаю здесь, но...

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

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

4 ответов


вы можете изменить класс UIView в Инспекторе удостоверений... сделай это!--0--> и затем вы можете добавить событие для UITouchUpInside для вашего вида-поймать краны на нем.

удачи!

EDIT: вот шаг за шагом со скриншотами:

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

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

вернитесь и измените UIView с помощью UIControl and... Change UIView to UIControl

та-даа! События! UIControl allows you to use events

крюк a способ события UITouchUpInside Add event for UITouchUpInside

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

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


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

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

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


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

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

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

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

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


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

Swift 3

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


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