Управление событиями в пользовательском UIControl - PullRequest
4 голосов
/ 05 марта 2011

Я создаю подкласс UIControl для создания пользовательского элемента управления, который содержит различные стандартные элементы управления.

Для этого обсуждения давайте предположим, что мой пользовательский UIControl содержит только UIButton.

Чего я хотел бы добиться, так это чтобы щелчок в любом месте пользовательского UIControl генерировал событие щелчка для этого пользовательского UIControl. Стандартное поведение состоит в том, что UIButton будет обрабатывать и потреблять (т.е. не пересылать) событие click.

Поскольку подкласс UIButton не рекомендуется, я не могу найти простой способ добиться этого.

Есть предложения?

Ответы [ 4 ]

12 голосов
/ 06 марта 2011

Я придумал простое решение, которое не требует подкласса UIButton.

В методе действия, определенном для события элемента управления TouchUpInside UIButton, я добавил следующую строку кода:

[self sendActionsForControlEvents:UIControlEventTouchUpInside];

В результате вызывается событие элемента управления TouchUpInside при щелчке в любом месте пользовательского UIControl.

0 голосов
/ 19 октября 2015
У

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

-(UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event{
  if(CGRectContainsPoint([self bounds], point){
    return self;
  }
  return [super hitTest:point withEvent:event];
}
0 голосов
/ 05 марта 2011

Часто я нахожу полезные задачи, связанные с взаимодействием с пользователем, в UIResponder class, который является суперклассом UIControl - UIButton. Читайте о – touchesBegan:withEvent:, – touchesMoved:withEvent:, – touchesEnded:withEvent:, – touchesCancelled:withEvent: в http://developer.apple.com/library/ios/#documentation/UIKit/Reference/UIResponder_Class/Reference/Reference.html. Вы можете найти способы настроить взаимодействие с пользователем для вашего UIButton. Кстати, я не думаю, что возникнет какая-либо проблема с подклассами UIButton, независимо от того, что вы слышали, если ваша реализация правильно добавлена ​​к реализации суперкласса или ответственно переопределяет ее вообще.

0 голосов
/ 05 марта 2011

UIButton предназначен для обработки сенсорных событий.Вы можете либо установить userInteractionEnabled на НЕТ, чтобы кнопка не принимала никаких касаний, либо вы можете использовать addTarget:action:forControlEvents: на кнопке, чтобы она вызывала метод в вашем классе при касании кнопки.

Кстати, где подкласс UIButton не рекомендуется?

...