Как «перевести» первого респондента из одного UIView в другой? - PullRequest
3 голосов
/ 13 сентября 2009

У меня есть подкласс UIView (CustomView для целей этого вопроса), который имеет собственную обработку всех touches событий (Begin, Moved, Ended, Cancelled). У меня также есть UIButton, который является родным братом CustomView, который перекрывает его.

Например, моя иерархия представлений выглядит следующим образом:

  • UIView (вид контроллера)
    • CustomView с рамкой (0, 0, 300, 300)
    • UIBКнопка с рамкой (0, 0, 100, 50)

Я бы хотел, чтобы CustomView фиксировал сенсорные события после того, как пользователь вытащил из UIButton. При ведении журнала отладки выясняется, что перехватывается событие UIControlEventTouchDragExit (хотя оно не срабатывает до тех пор, пока касание не будет на расстоянии около 100 пикселей от кнопки, но это не важно для этого вопроса).

В идеале, когда вызывается событие выхода при перетаскивании, кнопка прекращает получать события перемещения касанием, CustomView получает событие touchesBegan (даже если мне нужно каким-то образом подделать одно), и все будущие события касания (touchesMoved и т. Д.) Будут отправлены в CustomView.

Я пробовал следующее, и это не имеет никакого эффекта:

-(void)btnTouchDragExit:(id)sender
{
    UIButton * btn = sender;
    [btn resignFirstResponder];
    [customView becomeFirstResponder];
}

Я думаю, что базовый объект UITouch (который согласован для событий касания) не перенаправляется так, чтобы указывать на CustomView. Как мне добиться желаемого эффекта?

Ответы [ 2 ]

5 голосов
/ 13 сентября 2009

Просто используйте hitTest: withEvent: чтобы выяснить, какое представление «должно» получать событие, затем перешлите событие на соответствующее представление. Возможно, вам придется немного потанцевать, чтобы перехватить события, прежде чем они перейдут к кнопке, но для этого было сделано hitTest: withEvent:.

1 голос
/ 14 сентября 2009

Вы должны переопределить canBecomeFirstResponder, чтобы вернуть YES, иначе becomeFirstResponder ничего не делает. Это уже сделано на UIControl с, но не на UIView с

...