Получить последнее событие касания на 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
Надеюсь, поможет