Получить событие последнего касания в 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, поэтому я не могу получить точное последнее местоположение события касания в случае нескольких касаний.

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


person Bijoy Thangaraj    schedule 01.08.2018    source источник
comment
Чего именно вы пытаетесь достичь? Вам нужен постоянный мониторинг прикосновений, как в случае с приложением для рисования? Или это всего лишь одно касание, и вы хотите знать точную точку касания?   -  person Sandeep Bhandari    schedule 01.08.2018
comment
@SandeepBhandari Мне не нужен постоянный мониторинг позиций касания, но мне нужно обнаруживать все касания с их последними касаниями CGPoint, и должно поддерживаться несколько касаний.   -  person Bijoy Thangaraj    schedule 01.08.2018
comment
попробуйте мой ответ, размещенный ниже   -  person Sandeep Bhandari    schedule 01.08.2018


Ответы (1)


Вы всегда можете создать подкласс вашего представления и переопределить 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)

Необязательно (фаза: начало Количество TAP: 1 сила: 0,000 Окно :; Layer => Просмотр:> Место в окне: {175.66665649414062, 175.33332824707031} местоположение в поле зрения: {175.66665649414062, 175.33332824707031})

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

Можно ли использовать hitTest вместо touchBegan? Нет.

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

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

person Sandeep Bhandari    schedule 01.08.2018
comment
Спасибо вам за публикацию. Но когда есть несколько касаний, touches.first может содержать любое из случайных событий касания, поскольку этот набор не упорядочен. - person Bijoy Thangaraj; 01.08.2018
comment
@bijoy-thangaraj: я только что использовал прикосновение, чтобы показать вам, как оно синхронизируется с hitTest. Идея была скорее использовать hitTest. Так что попробуйте использовать hitTest - person Sandeep Bhandari; 01.08.2018
comment
@Bijoy Thangaraj: рад, что смог помочь. Удачного кодирования - person Sandeep Bhandari; 01.08.2018