Pergunta

Estou tentando implementar um botão redondo do tipo volume de controle. Atualmente, posso detectar os furtos pelo reconhecedor de gestos. Como posso detectar um gesto circular (no sentido horário e anti-horário) no botão? Obrigado!

Foi útil?

Solução

Você está procurando um gesto de um toque (como um controle deslizante circular) ou um gesto de dois toques (como agarrar e girar um botão do mundo real)? Se este último, dê uma olhada em UIRotationGestureRecognizer.

Se o primeiro, você está praticamente por conta própria. Você certamente pode implementar sua solução como seu próprio reconhecedor de gestos personalizado: isso é esperado pela Apple, e há Alguma documentação para você começar (Embora eu não tenha visto muitos exemplos de trabalho por aí). Veja também Como subclasse corretamente subclasse uigesturecognizer.

Como abordagem geral, eu pensaria na região para o gesto como uma forma de rosquinha: uma zona com centro c, raio interno R1, e raio externo r2. Quando o usuário toca, você pode calcular a distância de c Usando o teorema pitagórico e o ângulo com sua função TRIG favorita. Com isso, você pode determinar se o toque está dentro da zona. À medida que o usuário arrasta, você pode atualizar o valor de controle com base no ângulo. Em algum momento, eles se retiram ou arrastam para fora da zona, e isso terminará o gesto. Eu sugiro permitir que o toque se afasta muito por dentro R1 ou fora de r2: os dedos são ferramentas imprecisas.

Outras dicas

Como não encontrou uma solução e, por inspiração lógica da resposta de @Sixten, eu fui e criei algo útil, não é à prova de balas, mas parece fazer o que preciso agora.

Por favor, qualquer pessoa, bifurcá -lo, cloná -lo, use -o, melhorar, é de código aberto, aqui está o link do meu repo:

https://bitbucket.org/danielphillips/dpcirculargesturecognizer

Você já tentou escrever seu próprio reconhecedor de gestos? Existem instruções detalhadas nos documentos.

A melhor maneira seria implementar o reconhecedor de gestos personalizados. Não sei se você deseja detectar um gesto discreto (o método de manuseio de eventos seria chamado assim que o círculo completo for detectado) ou um gesto contínuo (o método de manuseio de eventos seria chamado toda vez que você move o dedo em um caminho circular).

Provavelmente, o usuário não pode desenhar um círculo perfeito, e a solução fornecida pelo @Sixten Otto seria boa.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top