¿Cómo agrego un evento táctil a una UIView?
Lo intento:
UIView *headerView = [[[UIView alloc] initWithFrame:CGRectMake(0, 0, tableView.bounds.size.width, nextY)] autorelease];
[headerView addTarget:self action:@selector(myEvent:) forControlEvents:UIControlEventTouchDown];
// ERROR MESSAGE: UIView may not respond to '-addTarget:action:forControlEvents:'
No quiero crear una subclase y sobrescribir
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
Respuestas:
En iOS 3.2 y versiones posteriores, puede usar reconocedores de gestos. Por ejemplo, así es como manejaría un evento de tap:
También hay un montón de gestos incorporados. Consulte los documentos para el manejo de eventos de iOS y
UIGestureRecognizer
. También tengo un montón de código de muestra en github que podría ayudar.fuente
CGPoint
representa la ubicación del toque en la supervista de la vista girada. Puede usar este punto para mover la vista girada (o una vista hermana) a la ubicación girada. Esto es más útil en el controladorUIPanGestureRecognizer
para arrastrar la vista por la pantalla.Reconocedores de gestos
Hay una serie de eventos táctiles (o gestos) de uso común que se le pueden notificar cuando agrega un Reconocimiento de gestos a su vista. Los siguientes tipos de gestos son compatibles de forma predeterminada:
UITapGestureRecognizer
Toque (tocar la pantalla brevemente una o más veces)UILongPressGestureRecognizer
Toque largo (tocar la pantalla durante mucho tiempo)UIPanGestureRecognizer
Pan (moviendo el dedo por la pantalla)UISwipeGestureRecognizer
Deslizar (mover el dedo rápidamente)UIPinchGestureRecognizer
Pellizcar (mover dos dedos juntos o separados, generalmente para hacer zoom)UIRotationGestureRecognizer
Rotar (mover dos dedos en dirección circular)Además de estos, también puede hacer su propio reconocedor de gestos personalizado.
Agregar un gesto en el generador de interfaces
Arrastre un reconocedor de gestos desde la biblioteca de objetos a su vista.
Controle el arrastre desde el gesto en el Esquema del documento hasta el código de su Controlador de vista para hacer una salida y una acción.
Esto debe establecerse de manera predeterminada, pero también asegúrese de que la Acción del usuario habilitada esté establecida en verdadero para su vista.
Agregar un gesto mediante programación
Para agregar un gesto mediante programación, usted (1) crea un reconocedor de gestos, (2) lo agrega a una vista y (3) crea un método que se llama cuando se reconoce el gesto.
Notas
sender
parámetro es opcional. Si no necesita una referencia al gesto, puede omitirlo. Sin embargo, si lo hace, elimine el(sender:)
nombre del método después de la acción.handleTap
método fue arbitraria. Nómbralo como quieras usar .action: #selector(someMethodName(sender:))
Más ejemplos
Puede estudiar los reconocedores de gestos que agregué a estas vistas para ver cómo funcionan.
Aquí está el código para ese proyecto:
Notas
fuente
UIView
también debe agregar:self.isUserInteractionEnabled = true;
Creo que simplemente puedes usar
Me refiero a headerView se extiende desde UIControl.
fuente
UITapGestureRecognizer
no es un sustituto deUIControlEventTouchDown
. ATap
generalmente se compone deUIControlEventTouchDown
yUIControlEventTouchUpInside
.UIView
no es aUIControl
y por lo tanto no tiene acceso aaddTarget:action:forControlEvents:
.Swift 3 y Swift 4
Utilizar
fuente
Según la respuesta aceptada , puede definir una macro:
Esta macro usa ARC, por lo que no hay
release
llamada.Ejemplo de uso de macro:
fuente
Puede lograr esto agregando Gesture Recognizer en su código.
Paso 1: ViewController.m:
Paso 2: ViewController.m:
NOTA: aquí yourView en mi caso fue
@property (strong, nonatomic) IBOutlet UIView *localView;
EDITAR: * localView es el cuadro blanco en Main.storyboard desde abajo
fuente
En Swift 4.2 y Xcode 10
Use UITapGestureRecognizer para agregar un evento táctil
Si quieres usar SharedClass
Tengo 3 vistas en mi ViewController llamadas view1, view2 y view3.
fuente
Heres una versión Swift:
fuente
BlockTap
?Swift 3:
fuente
Parece bastante simple en estos días. Esta es la versión Swift.
fuente
Aquí está ios tapgesture; Primero debe crear una acción para GestureRecognizer después de escribir el siguiente código debajo de la acción como se muestra a continuación
fuente
Otra forma es agregar un botón transparente a la vista
Y luego, maneja el clic:
fuente
Cree un reconocedor de gestos (subclase), que implementará eventos táctiles, como
touchesBegan
. Puede agregarlo a la vista después de eso.De esta forma, usará la composición en lugar de subclases (que era la solicitud).
fuente
¿Por qué no prueban SSEventListener ?
No necesita crear ningún reconocedor de gestos y separar su lógica de otro método.
SSEventListener
admite la configuración de bloques de escucha en una vista para escuchar el gesto de un solo toque, el gesto de doble toque y el gesto de N-toque si lo desea, y el gesto de pulsación larga. Configurar un oyente de gestos de un solo toque se convierte de esta manera:[view ss_addTapViewEventListener:^(UITapGestureRecognizer *recognizer) { ... } numberOfTapsRequired:1];
fuente
C objetivo:
Rápido:
La pregunta pregunta:
No está pidiendo un evento de tap .
Específicamente OP quiere implementar
UIControlEventTouchDown
Cambio de la
UIView
queUIControl
es la respuesta correcta aquí porqueGesture Recognisers
no se sabe nada acerca de.touchDown
,.touchUpInside
,.touchUpOutside
etc.Además, UIControl hereda de UIView para que no pierda ninguna funcionalidad.
Si todo lo que desea es un toque, puede usar el Reconocimiento de gestos. Pero si desea un control más preciso, como se hace en esta pregunta, necesitará UIControl.
https://developer.apple.com/documentation/uikit/uicontrol?language=objc https://developer.apple.com/documentation/uikit/uigesturerecognizer?language=objc
fuente