TouchUpInside на UIView с детьми
Возможно, я здесь что-то пропустил, но...
У меня есть UIView
с несколькими детьми (пара UILabel
и UIImageView
). Мне нужно поймать событие, когда пользователь щелкает (отбрасывает) в любом месте родительского UIView
- видимую часть UIView
или любого из его дочерних элементов).
Какой лучший способ сделать это?
Ответы
Ответ 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!")
}