Quero emular um botão de pressionamento longo, como posso fazer isso? Acho que é necessário um cronômetro. Entendo, UILongPressGestureRecognizer
mas como posso utilizar esse tipo?
ios
objective-c
uibutton
long-press
Andrea
fonte
fonte
if(gesture.state == UIGestureRecognizerStateBegan)
, porque o usuário espera que algo aconteça quando ainda está pressionando (o estado Começou), não quando ele soltou (Terminado).Como alternativa à resposta aceita, isso pode ser feito facilmente no Xcode usando o Interface Builder.
Basta arrastar um Reconhecedor de gestos de pressionamento longo da Biblioteca de objetos e soltá-lo no topo do botão onde deseja pressionar prolongadamente.
Em seguida, conecte uma ação do Long Press Gesture Recognizer recém-adicionado ao controlador de exibição, selecionando o remetente para ser do tipo
UILongPressGestureRecognizer
. No código desseIBAction
uso, que é muito semelhante ao código sugerido na resposta aceita:Em Objective-C :
Ou em Swift :
Mas devo admitir que depois de tentar, prefiro a sugestão feita por @shengbinmeng como comentário à resposta aceita, que era usar:
Em Objective-C :
Ou em Swift :
A diferença é que com
Ended
, você vê o efeito do toque longo ao levantar o dedo. ComBegan
, você vê o efeito do toque longo assim que o toque longo for capturado pelo sistema, mesmo antes de tirar o dedo da tela.fonte
Versão rápida da resposta aceita
Fiz a modificação adicional de usar em
UIGestureRecognizerState.Began
vez de,.Ended
uma vez que é provavelmente o que a maioria dos usuários naturalmente espera. Experimente os dois e veja por si mesmo.fonte
Experimente isto:
Adicionando botão
viewDidLoad:
como abaixoAgora chame o método de gesto assim
fonte
recognizer.view.tag
me dá a tag errada do UIButton clicado. Qualquer solução?Eu acho que você precisa da minha solução.
você deve ter este código para um único toque
primeiro, adicione um gesto de toque longo para o botão
em seguida, chame o evento de toque único repetidamente se o gesto de toque longo for reconhecido.
fonte
UIGestureRecognizer
durante oviewWillAppear
evento de ciclo de vida, porque sempre que a visualização aparecer, outro reconhecedor de gesto será adicionado. Isso deve ser feito em um método privado que é chamado durante a inicialização.Para Swift 4, o "func longPress" precisa ser alterado para que funcione:
fonte
Resposta de uma linha, sem gestos:
[btn addTarget:self action:@selector(handleTouch:) forControlEvents:UIControlEventTouchDown | UIControlEventTouchUpInside | UIControlEventTouchUpOutside];
Detalhes: Isso desencadeia o seu alvo em três eventos: 1- Imediatamente, uma vez toques de dedo pressionado o botão:
UIControlEventTouchDown
. Isso captura o início de pressionamentos longos. 2 e 3- Quando o usuário levanta o dedo:UIControlEventTouchUpOutside
&UIControlEventTouchUpInside
. Isso captura o final da imprensa do usuário.Observação: isso funciona bem se você não se importar com as informações extras fornecidas pelo reconhecedor de gestos (por exemplo, localização do toque, etc.)
Você pode adicionar mais eventos intermediários se necessário, veja todos aqui https://developer.apple.com/documentation/uikit/uicontrolevents?language=objc .
No Storyboard: Conecte seu botão aos 3 eventos, não apenas ao padrão que o Storyboard seleciona (Touch Up Inside).
fonte
Eu tenho um UIButton subclasse para meu aplicativo, então retirei minha implementação. Você pode adicionar isso à sua subclasse ou pode ser facilmente recodificado como uma categoria UIButton.
Meu objetivo era adicionar o toque longo ao meu botão sem sobrecarregar meus controladores de visualização com todo o código. Decidi que a ação deve ser chamada quando o estado do reconhecedor de gestos começa.
Há um aviso que nunca me preocupei em resolver. Diz que é um possível vazamento, pensei ter testado o código e não vaza.
Para atribuir a ação, adicione esta linha ao seu método viewDidLoad.
A ação deve ser definida como todas as IBActions (sem a IBAction).
fonte
Nenhum funcionou, portanto, tentei escrever código longpress em
IBAction
ou clicarstoryboard
no botão em emController
vez de escrever emviewDidLoad
fonte