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

Solución al problema de que UIButton en iOS no responde al clic

Introducción

En el desarrollo diario, a menudo nos enfrentamos a botones, pero a veces nos encontramos con problemas difíciles de manejar, como que el botón no responde al evento de clic, en este caso, necesitamos investigar desde varios aspectos

Razones por las que el botón no responde

1、El botón se ha agregado a un padreView sin interacción del usuario, por ejemplo, UIImageView, en este caso, active la interacción del padreView view.userInteractionEnabled = YES

Establecerlo en YES puede resolver el problema

2、El botón mismo está obstruido, al hacer clic no se hace clic en el botón, sino en la vista de nivel superior, por lo que naturalmente no se responderá

Aquí hay un método para ver las capas, como se muestra en la imagen siguiente, haciendo clic en el botón del cuadro rojo puede ver los elementos UI de la interfaz de ejecución actual, y puede ver si hay alguna vista que obstruya el botón

3、El frame del botón está fuera del frame del padre, esto es lo más común, el frame del botón debe estar dentro del frame del padre para que sea efectivo al hacer clic, como se muestra en la imagen siguiente. El área de clic del botón en el cuadro rojo no se responde.

¿Qué hacer si se encuentra con este problema? Sigue leyendo a continuación

Solución al problema de la superposición del área de clic

Esta situación es muy posible de ocurrir, aquí hay un ejemplo que me ha pasado: la altura del área de chat es menor que la altura del teclado, y el cuadro de entrada es una vista secundaria del área de chat. Después de que se abre el teclado, el cuadro de entrada se mueve hacia arriba y sale del frame del padre. En este momento, al hacer clic en el botón del cuadro rojo para cambiar la acción del teclado de emoticones, no se responde.

Solución

Aquí hay dos métodos, que se ejecutan cada vez que hay un movimiento de toque

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

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

Este es un método en View, y el flujo de procesamiento es el siguiente

  • Primero se llama al método pointInside:withEvent: de la vista actual para determinar si el punto de toque está dentro de la vista actual;
  • Si devuelve NO, hitTest:withEvent: devuelve nil;
  • Si devuelve YES, se envía el mensaje hitTest:withEvent: a todas las vistas secundarias de la vista actual (subviews), y el orden de recorrido de todas las vistas secundarias es de arriba a abajo, es decir, desde el final del array subviews hacia adelante, hasta que se devuelve un objeto no nulo de alguna vista secundaria o se han recorrido todas las vistas secundarias;
  • Si la primera vista secundaria devuelve un objeto no nulo, el método hitTest:withEvent: devuelve este objeto y se termina el procesamiento;
  • Si todos los subvisualizadores devuelven no, el método hitTest:withEvent: devuelve a sí mismo (self).
  • Finalmente, este evento táctil se entrega al objeto de vista devuelto por el método hitTest:withEvent: del ventana principal.

Por lo tanto, podemos manejar la devolución de nil, porque en este momento el botón está fuera del View padre

//Devuelve un view para responder al evento
- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event{
 UIView *view = [super hitTest:point withEvent:event];
 if (view == nil){
  //Transformar coordenadas
  CGPoint tempPoint = [self.testBtn convertPoint:point fromView:self];
  //判断点击的点是否在按钮区域内
  if (CGRectContainsPoint(self.testBtn.bounds, tempPoint)){
   //Volver al botón
   return _testBtn;
  }
 }
 return view;
}

En este momento, el clic en el botón en el área exterior también tiene efecto

Resumen

Lo que se menciona anteriormente es la solución que el editor les ha presentado para el problema de que el UIButton de iOS no responde al clic, espero que les sea útil. Si tienen alguna pregunta, déjenme un mensaje, el editor les responderá a tiempo. También muy agradecido por el apoyo a los tutoriales de gritos!

Declaración: el contenido de este artículo se ha obtenido de la red, pertenece a los autores originales, el contenido se ha contribuido y subido por los usuarios de Internet de manera autónoma. Este sitio no posee los derechos de propiedad, no ha sido editado por humanos y no asume responsabilidad alguna por la responsabilidad legal. Si encuentra contenido sospechoso de infracción de derechos de autor, por favor envíe un correo electrónico a: notice#oldtoolbag.com (al enviar un correo electrónico, por favor reemplace # con @) para denunciar, y proporcionar evidencia relevante. Una vez verificada, este sitio eliminará inmediatamente el contenido sospechoso de infracción.

Te gustará