ios - tap gesture recognizer swift 4
toque el reconocedor de gestos: ¿qué objeto se tocó? (10)
Soy nuevo en los reconocedores de gestos por lo que tal vez esta pregunta suene tonta: estoy asignando reconocimientos de gestos de toque a un grupo de UIViews. En el método, ¿es posible averiguar cuál de ellos fue aprovechado de alguna manera o necesito encontrarlo usando el punto que se tocó en la pantalla?
for (NSUInteger i=0; i<42; i++) {
float xMultiplier=(i)%6;
float yMultiplier= (i)/6;
float xPos=xMultiplier*imageWidth;
float yPos=1+UA_TOP_WHITE+UA_TOP_BAR_HEIGHT+yMultiplier*imageHeight;
UIView *greyRect=[[UIView alloc]initWithFrame:CGRectMake(xPos, yPos, imageWidth, imageHeight)];
[greyRect setBackgroundColor:UA_NAV_CTRL_COLOR];
greyRect.layer.borderColor=[UA_NAV_BAR_COLOR CGColor];
greyRect.layer.borderWidth=1.0f;
greyRect.userInteractionEnabled=YES;
[greyGridArray addObject:greyRect];
[self.view addSubview:greyRect];
NSLog(@"greyGrid: %i: %@", i, greyRect);
//make them touchable
UITapGestureRecognizer *letterTapRecognizer = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(highlightLetter)];
letterTapRecognizer.numberOfTapsRequired = 1;
[greyRect addGestureRecognizer:letterTapRecognizer];
}
Aquí hay una actualización de Swift 3 y una adición a la respuesta de Mani. Sugeriría usar sender.view
en combinación con etiquetar UIViews (u otros elementos, dependiendo de lo que trates de rastrear) para un enfoque algo más "avanzado".
- Agregar el UITAPGestureRecognizer a, por ejemplo, un UIButton (también puede agregarlo a UIViews, etc.) O a un conjunto completo de elementos en una matriz con un for-loop y un segundo conjunto para los gestos de tap.
let yourTapEvent = UITapGestureRecognizer(target: self, action: #selector(yourController.yourFunction))
yourObject.addGestureRecognizer(yourTapEvent) // adding the gesture to your object
Definir la función en el mismo TestController (ese es el nombre de su Controlador de Vista). Aquí vamos a usar tags : las etiquetas son ID de Int, que puede agregar a su UIView con
yourButton.tag = 1
. Si tiene una lista dinámica de elementos como una matriz, puede crear un bucle for, que itera a través de su matriz y agrega una etiqueta, que aumenta gradualmentefunc yourFunction(_ sender: AnyObject) { let yourTag = sender.view!.tag // this is the tag of your gesture''s object // do whatever you want from here :) e.g. if you have an array of buttons instead of just 1: for button in buttonsArray { if(button.tag == yourTag) { // do something with your button } } }
La razón de todo esto es que no puede pasar más argumentos para suFunción cuando la usa junto con #selector.
Si tienes una estructura de UI aún más compleja y quieres adjuntar la etiqueta de los padres del elemento a tu gesto, puedes usar let yourAdvancedTag = sender.view!.superview?.tag
por ejemplo, obtener la etiqueta UIView de un botón presionado dentro ese UIView; puede ser útil para listas de miniaturas + botones, etc.
Debe modificar la creación del reconocedor de gestos para aceptar el parámetro (agregar dos puntos '':'')
UITapGestureRecognizer *letterTapRecognizer = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(highlightLetter:)];
Y en su método highlightLetter: puede acceder a la vista adjunta al reconocedor:
-(IBAction) highlightLetter:(UITapGestureRecognizer*)recognizer
{
UIView *view = [recognizer view];
}
Defina su selector de destino ( highlightLetter:
Cartas highlightLetter:
con un argumento como
UITapGestureRecognizer *letterTapRecognizer = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(highlightLetter:)];
Entonces puedes ver por
- (void)highlightLetter:(UITapGestureRecognizer*)sender {
UIView *view = sender.view;
NSLog(@"%d", view.tag);//By tag, you can find out where you had tapped.
}
Ha pasado un año haciendo esta pregunta, pero aún así para alguien.
Al declarar el UITapGestureRecognizer
en una vista particular, asigne la etiqueta como
UITapGestureRecognizer *tapRecognizer = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(gestureHandlerMethod:)];
[yourGestureEnableView addGestureRecognizer:tapRecognizer];
yourGestureEnableView.tag=2;
y en tu controlador haz esto
-(void)gestureHandlerMethod:(UITapGestureRecognizer*)sender {
{
if(sender.view.tag==2) {
//do something here
}
}
Si agrega UIGestureRecognizer
diferente en diferentes UIView
y desea distinguir en el método de acción, puede verificar la vista de propiedad en el parámetro del remitente, que le dará la vista del remitente.
También puede usar el método "shouldReceiveTouch" de UIGestureRecognizer
- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch: (UITouch *)touch {
UIView *view = touch.view;
NSLog(@"%d", view.tag);
}
No olvides configurar el delegado de tu reconocedor de gestos.
Use este código en Swift
func tappGeastureAction(sender: AnyObject) {
if let tap = sender as? UITapGestureRecognizer {
let point = tap.locationInView(locatedView)
if filterView.pointInside(point, withEvent: nil) == true {
// write your stuff here
}
}
}
en rápido es bastante simple
Escriba este código en la función ViewDidLoad ()
let tap = UITapGestureRecognizer(target: self, action: #selector(tapHandler(gesture:)))
tap.numberOfTapsRequired = 2
tapView.addGestureRecognizer(tap)
The Handler Part this podría estar en viewDidLoad o fuera de viewDidLoad, batter se pone en extensión
@objc func tapHandler(gesture: UITapGestureRecognizer) {
currentGestureStates.text = "Double Tap"
}
Aquí solo estoy probando el código imprimiendo el resultado. Si quieres hacer una acción, puedes hacer lo que quieras o practicar más y leer
puedes usar
- (void)highlightLetter:(UITapGestureRecognizer*)sender {
UIView *view = sender.view;
NSLog(@"%d", view.tag);
}
ver será el Objeto en el que se reconoció el gesto de toque
func tabGesture_Call
{
let tapRec = UITapGestureRecognizer(target: self, action: "handleTap:")
tapRec.delegate = self
self.view.addGestureRecognizer(tapRec)
//where we want to gesture like: view, label etc
}
func handleTap(sender: UITapGestureRecognizer)
{
NSLog("Touch..");
//handling code
}