Ответ 1
Я столкнулся с той же проблемой и придумал решение. Это не удивительно красиво, но работает неплохо. Это категория UIControl, в которой хранится последний UIControlEvent, запускаемый для собственного свойства тега. Вы можете получить его по ссылке ниже. Для получения дополнительной информации, здесь документ из моей категории, для более подробного описания того, что происходит.
Надеюсь, это поможет! Приветствия /J
UIControl + CaptureUIControlEvents
git gist at: http://gist.github.com/513796
ПРОБЛЕМА: при стрельбе UIControlEvents не передаются в целевое действие назначенный конкретному событию. Это было бы полезно, чтобы одно действие, которое переключается на запуск UIControlEvent.
РЕШЕНИЕ: добавьте способ сохранения UIControlEvent, инициированного в UIEvent.
ПРОБЛЕМА: Но мы не можем переопределять частные API, поэтому: (ХОРОШЕЕ) РЕШЕНИЕ: иметь UIControl магазин UIControlEvent, который был последним.
Документация UIControl гласит, что:
Когда пользователь касается элемента управления таким образом, который соответствует одному или нескольким определенные события, UIControl отправляет себя sendActionsForControlEvents:. Это приводит к тому, что UIControl отправляет действие в UIApplication в sendAction: to: from: forEvent: сообщение.
Можно подумать, что sendActionsForControlEvents: может быть переопределено (или подклассы) для хранения флага, но это не так. Кажется, что sendActionsForControlEvents: в основном для клиентов для запуска событий программно.
Вместо этого мне пришлось настроить схему, которая регистрирует действие для каждого элемента управления событие, которое нужно отслеживать. Я решил не отслеживать все события (или в все UIControls) для производительности и простоты использования.
ПРИМЕР ПРИМЕНЕНИЯ:
В настройке UIControl:
UIControlEvents capture = UIControlEventTouchDown;
capture |= UIControlEventTouchDown;
capture |= UIControlEventTouchUpInside;
capture |= UIControlEventTouchUpOutside;
[myControl captureEvents:capture];
[myControl addTarget:self action:@selector(touch:) forControlEvents:capture];
И целевое действие:
- (void) touch:(UIControl *)sender {
UIColor *color = [UIColor clearColor];
switch (sender.tag) {
case UIControlEventTouchDown: color = [UIColor redColor]; break;
case UIControlEventTouchUpInside: color = [UIColor blueColor]; break;
case UIControlEventTouchUpOutside: color = [UIColor redColor]; break;
}
sender.backgroundColor = color;
}