English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

Solução para o Problema do UIButton do iOS Não Responder ao Clique

Pré-face

No desenvolvimento diário, frequentemente lidamos com botões, mas às vezes encontramos problemas difíceis de lidar, como botões que não respondem a eventos de clique. Neste caso, precisamos investigar a seguir

Razão pelo qual o botão não responde

1O botão foi adicionado a um paiView que não permite interação do usuário, por exemplo, UIImageView, neste caso, habilite a interação do paiView view.userInteractionEnabled = YES

Definir como YES pode resolver o problema

2O botão em si está obscurecido, ao clicar, não está clicando no botão, mas na camada View acima dele, naturalmente, não será respondido

Aqui está um método para ver a camada, na imagem a seguir, clicando no botão dentro da caixa vermelha, você pode ver os elementos UI da interface de execução atual, você pode ver se há view obscurecendo o botão

3O frame do botão ultrapassa o frame do pai, isso é o mais fácil de acontecer, o frame do botão deve estar dentro do frame do pai para que o clique seja válido, como na imagem a seguir, a área clicável do botão dentro da caixa vermelha não é respondida.

O que fazer se encontrar esse problema? Continue lendo abaixo

Solução para o problema de clique fora da área

Essa situação pode acontecer muito frequentemente, por exemplo, a altura da área de chat é menor que a altura do teclado, e o campo de entrada é um subView da área de chat. Quando o teclado é acionado, o campo de entrada se move para cima e ultrapassa o frame do pai. Neste momento, ao clicar no botão dentro da caixa vermelha para alternar a ação do teclado de expressão, o clique não é respondido.

Solução

Aqui há dois métodos, que são executados a cada toque

- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event;
- (BOOL)pointInside:(CGPoint)point withEvent:(UIEvent *)event;

Sobrescrever método - (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event

Este é um método dentro de View, e o fluxo de trabalho é o seguinte

  • Primeiro, chama o método pointInside:withEvent: da vista atual para determinar se o ponto de toque está dentro da vista atual;
  • Se retornar NO, hitTest:withEvent: retorna nil;
  • Se retornar YES, envia a mensagem hitTest:withEvent: para todos os subviews da vista atual, a ordem de varredura dos subviews é de cima para baixo, ou seja, da extremidade inferior do array subviews para a extremidade superior, até que um subview não vazio seja retornado ou todos os subviews tenham sido varridos;
  • Se o primeiro subview retornado não for vazio, o método hitTest:withEvent: retorna este objeto e o processo é finalizado;
  • Se todos os subvisuais retornarem não, o método hitTest:withEvent: retorna a si mesmo (self).
  • Finalmente, este evento de toque é entregue ao objeto de view retornado pelo método hitTest:withEvent: da janela principal.

Portanto, podemos lidar com o retorno nil, porque neste momento, o botão está fora do View pai

//Retorna um view para responder ao evento
- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event{
 UIView *view = [super hitTest:point withEvent:event];
 if (view == nil){
  //Converter coordenadas
  CGPoint tempPoint = [self.testBtn convertPoint:point fromView:self];
  //Verificar se o ponto de clique está dentro da área do botão
  if (CGRectContainsPoint(self.testBtn.bounds, tempPoint)){
   //Botão de retorno
   return _testBtn;
  }
 }
 return view;
}

Agora, o clique em uma área fora do botão também tem efeito

Resumo

O que foi mencionado acima é a solução que o editor apresentou para o problema de clique irrelevante do UIButton iOS, esperamos que ajude a todos. Se você tiver alguma dúvida, por favor, deixe um comentário, o editor responderá a todos a tempo. Agradecemos também o apoio ao tutorial de gritos!

Declaração: O conteúdo deste artigo é extraído da Internet, pertence ao respectivo detentor dos direitos autorais, foi contribuído e carregado voluntariamente pelos usuários da Internet, este site não possui direitos de propriedade, não foi editado manualmente e não assume responsabilidades legais relacionadas. Se você encontrar conteúdo suspeito de violação de direitos autorais, por favor, envie um e-mail para: notice#oldtoolbag.com (ao enviar e-mail, substitua # por @ para denunciar e forneça provas relevantes. Caso seja confirmado, o site deletará imediatamente o conteúdo suspeito de violação de direitos autorais.)

Você Também Pode Gostar