Как обнаружить круговой жест с помощью Gesture Recognizer?
Я пытаюсь реализовать круглую кнопку, похожую на регулятор громкости. В настоящее время я могу обнаруживать пролистывания с помощью Gesture Recognizer. Как я могу обнаружить круговой жест (по часовой стрелке и против часовой стрелки) на кнопке? Спасибо!
4 ответа
Вы ищете жест в одно касание (например, круговой слайдер) или жест в два касания (например, захват и поворот ручки реального мира)? Если последнее, взгляните на UIRotationGestureRecognizer
,
Если первый, вы в значительной степени самостоятельно. Вы, безусловно, можете реализовать свое решение в качестве собственного собственного распознавателя жестов: это ожидается Apple, и есть некоторая документация, с которой можно начать (хотя я не видел много рабочих примеров там). Смотрите также Как правильно создать подкласс UIGestureRecognizer.
В качестве общего подхода я бы рассматривал область для жеста как форму пончика: зону с центром c, внутренним радиусом r1 и внешним радиусом r2. Когда пользователь прикасается, вы можете рассчитать расстояние от c, используя теорему Пифагора, и угол с вашей любимой функцией триггера. При этом вы можете определить, находится ли касание в зоне. Когда пользователь перетаскивает, вы можете обновить контрольное значение в зависимости от угла. В какой-то момент они либо подправят, либо потянут за пределы зоны, и на этом жест закончится. Я предлагаю позволить касанию отклоняться довольно далеко внутри r1 или снаружи r2: пальцы - неточные инструменты.
Поскольку я не смог найти решения и, по логике вдохновения из ответа @sixten, я пошел и создал что-то полезное, это не пуленепробиваемое доказательство, но, похоже, он делает то, что мне сейчас нужно.
Пожалуйста, кто-нибудь, раскошелиться, клонировать, использовать, улучшать, это с открытым исходным кодом, вот моя ссылка на репо:
https://bitbucket.org/danielphillips/dpcirculargesturerecognizer
Лучшим способом было бы реализовать Custom Gesture Recognizer. Я не знаю, хотите ли вы обнаружить Discreet Gesture (метод обработки событий будет вызван после того, как будет обнаружен полный круг) или Continues Gesture (метод обработки событий будет вызываться каждый раз, когда вы перемещаете палец по круговой траектории).
Возможно, пользователь может не нарисовать идеальный круг, и решение, предоставленное @Sixten Otto, будет хорошим.
Вы пытались написать свой собственный распознаватель жестов? В документах есть подробные инструкции.