Событие касания обрабатывается несколькими видами - PullRequest
9 голосов
/ 04 декабря 2011

У меня есть подкласс UIView поверх UITableView. Я использую UITableView для отображения некоторых данных, и в то же время я хотел бы наложить анимацию, которая следует за пальцем (например, оставляя след).

Если я правильно понял, мне нужно обработать сенсорные события и подклассом UIView и UITableView. Как я могу это сделать? Можно ли, например, touchesMoved быть запущенным на подклассе UIView, а затем на UITableView?

Большое спасибо за любую помощь.

Ответы [ 3 ]

11 голосов
/ 09 декабря 2011

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

Я переопределил hitTest для своего пользовательского UIView, чтобы он направлял касания к UITableView внизу. Затем в UITableView я обрабатываю жесты через touchesBegan, touchesMoved и т. Д. Там я также звоню touchesBegan на UIView.

Таким образом, касания обрабатываются двумя видами. Причина, по которой я не поступаю наоборот (имея UIView s touchesBegan, вызывающий UITableView 'touchesBegan), заключается в том, что распознаватели жестов на UITableView не будут работать.

UIView подкласс 'hitTest

- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event
{
    // tview is the UITableView subclass instance
    CGPoint tViewHit = [tView convertPoint:point fromView:self];        
    if ([tView pointInside:tViewHit withEvent:event]) return tView;

    return [super hitTest:point withEvent:event];
}

UITableView подклассов touchesBegan

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
    UITouch *touch = [touches anyObject];
    CGPoint location = [touch locationInView:touch.view];
    // ....

    // view is the UIView's subclass instance
    [view touchesBegan:touches withEvent:event];
}
1 голос
/ 04 декабря 2011

Нет, ты не можешь сделать это безбожно. Событие доставки глава гласит

Объект окна использует проверку попаданий и цепочку респондента, чтобы найти просмотреть, чтобы получить сенсорное событие. В хит-тестировании окно вызывает hitTest: withEvent: в самом верхнем представлении иерархии представлений; этот метод продолжается путем рекурсивного вызова pointInside: withEvent: на каждом вид в иерархии представлений, которая возвращает ДА, продолжая вниз иерархии, пока не найдет подпредставление, в пределах которого касание состоялся Это представление становится представлением проверки нажатия.

Таким образом, когда окно находит касавшийся вид, оно возвращает ДА. Только один вид может обрабатывать касания в текущий момент.

Но если вам нужно обработать событие для UITableView, тогда обработайте его для UIView! Вы можете преобразовать точку касания в необходимые координаты с помощью функций - convertPoint , - convertRect , добавить подпредставление в UITableView и переместить его в зависимости от координаты и многих других вещей.

0 голосов
/ 04 декабря 2011

UITableView передает необработанные сенсорные события в UIView. (Google "цепочка респондента") Документация UITableView

Таким образом, вы можете обрабатывать сенсорные события только в UIView. Так. В вашем UIView

  1. touch-start - выполнить инициализацию

  2. touchchesmove - нарисуйте хвост на UIView (используйте таймеры / отложенный ответ для желаемых точек, чтобы он выглядел как след)

  3. touchesend - делать оставшиеся вещи

Надеюсь, это поможет.

...