Получить последнее событие касания на UIView

Примечание: этот вопрос похож на тот, что задают здесь, но ответ при условии, что в моем случае это не совсем решение. Цель вопроса тоже другая. Ссылка: touchesBegan - нужно только последнее действие касания - iPhone

Я пытаюсь справиться с несколькими касаниями в UIView, Мне нужно получить точные позиции касания в порядке.

В настоящее время я прикрепляю селектор вот так:

[myView addTarget:self action:@selector(touchBegan:withEvent:) forControlEvents: UIControlEventTouchDown];

Это мой обработчик,

- (void)touchBegan:(UIButton *)c withEvent:ev {
    UITouch *touch = [[ev allTouches] anyObject];

Проблема здесь в том, что [ev allTouches] возвращает NSSet это неупорядочено, поэтому я не могу получить точное последнее местоположение события касания в случае нескольких касаний.

Есть ли способ получить последнее местоположение в случае обработки нескольких касаний?

1 ответ

Решение

Вы всегда можете создать подкласс своего View и переопределить hitTest чтобы получить точную точку соприкосновения

override func hitTest(_ point: CGPoint, with event: UIEvent?) -> UIView? {
    debugPrint(point)
    return super.hitTest(point, with: event)
}

Здесь я только регистрирую точку касания. Просто чтобы показать, как это работает, я добавил touchesBegan в моем ViewController и вошли первые точки касания от набора прикосновений

override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
    debugPrint(touches.first)
}

Вот консольный журнал для обоих

(175,66667175293, 175,33332824707)

Необязательно (фаза: количество начатых нажатий: 1 сила: 0,000 окна:; layer = > view: > местоположение в окне: {175.66665649414062, 175.33332824707031} предыдущее местоположение в окне: {175.66665649414062, 175.33332824707031} расположение в представлении: {175.66665649414062, 175.333} 7070 расположение в поле зрения: {175.66665649414062, 175.33332824707031})

Таким образом, проверка попадания говорит, что ваша точка касания (175.66667175293, 175.33332824707) в то время как touches.first говорит местоположение в поле зрения: {175.66665649414062, 175.33332824707031}, которые в основном одинаковы.

Можно hitTest использоваться в качестве замены touchBegan ? Нет

Вот почему я спросил в комментариях выше, что именно вы пытаетесь достичь. Если вы ищете постоянный мониторинг касаний, чем touchBegan, touchMove, touchEnd те делегаты, которых вы должны выбрать, но если вы пытаетесь контролировать одно касание и найти его точную точку касания, вы всегда можете использовать hitTest

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

Другие вопросы по тегам