Как обнаружить круговой жест через Grecure Recognizer?

Я пытаюсь реализовать круглую кнопку с контролем громкости. В настоящее время я могу обнаружить swipes с помощью распознавателя жестов. Как я могу обнаружить круговой жест (по часовой стрелке и против часовой стрелки) на кнопке? Спасибо!

Ответ 1

Вы ищете жест одним касанием (например, круговой слайдер) или жест с двумя касаниями (например, захват и поворот ручки реального мира)? Если последний, посмотрите UIRotationGestureRecognizer.

Если первый, вы в значительной степени по своему усмотрению. Вы, безусловно, можете реализовать свое решение в качестве своего собственного распознавателя жестов: это ожидается от Apple, и какая-то документация, чтобы вы начали (хотя я не видели много рабочих примеров). См. Также Как правильно подклассифицировать UIGestureRecognizer.

Как общий подход, я бы подумал о области для жесты как форму пончика: зона с центром c, внутренний радиус r1 и внешний радиус r2. Когда пользователь прикасается вниз, вы можете рассчитать расстояние от c, используя теорему Пифагора, и угол с вашей любимой функцией триггера. При этом вы можете определить, находится ли касание в зоне. Когда пользователь перетаскивает, вы можете обновить контрольное значение на основе угла. В какой-то момент они либо поднимутся, либо перетянут за пределы зоны, и это закончит жест. Я предлагаю, чтобы прикосновение слегка заблудилось внутри r1 или вне r2: пальцы - неточные инструменты.

Ответ 2

Как не найти решение, и по логическому вдохновению от ответа @sixten, я пошел и создал что-то полезное, это не доказательство пули, но, похоже, оно делает то, что мне нужно сейчас.

Пожалуйста, кто угодно, разветките его, клонируйте, используйте, улучшите, он с открытым исходным кодом, здесь моя ссылка репо:

https://bitbucket.org/danielphillips/dpcirculargesturerecognizer

Ответ 3

Вы пробовали написать свой собственный распознаватель жестов? В документах содержатся подробные инструкции.

Ответ 4

Лучший способ - реализовать пользовательский распознаватель жестов. Я не знаю, хотите ли вы обнаружить Discreet Gesture (метод обработки событий будет вызван после обнаружения полного круга) или Continuous Gesture (метод обработки событий будет вызываться каждый раз, когда вы перемещаете палец по круговой траектории).

Возможно, пользователь не может нарисовать идеальный круг, и решение, предоставленное @Sixten Otto, будет хорошим.