www will used thus tag para not manager gtm googletagmanager google found apps and ios objective-c touch uitouch

ios - will - ¿Cómo saber en qué vista terminó un evento táctil?



tag manager is not found and thus will not be used (5)

Deseo arrastrar un UIImage a uno de varios UIButtons y reubicarlo en función del botón al que lo arrastre.

El problema con el que me he encontrado es que UITouch solo registra la vista donde comenzó mi toque, me gustaría acceder a la vista en la que termina. ¿Cómo puedo hacer esto?

Código:

-(void) touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event { UITouch *touch = [touches anyObject]; CGPoint location = [touch locationInView:self.view]; dealerBtnOrigin = [touch locationInView:self.view]; //NSLog(@"%u %u",touch.view.tag, ((UIView *)[dealerBtns objectAtIndex:[table getButtonSeat]]).tag); //CHECK TO SEE WHICH BUTTON WAS TOUCHED if (touch.view == ((UIView *)[dealerBtns objectAtIndex:[table getButtonSeat]])) { ((UIView *)[dealerBtns objectAtIndex:[table getButtonSeat]]).center = location; } } -(void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event { UITouch *touch = [touches anyObject]; CGPoint location = [touch locationInView:self.view]; if (touch.view == ((UIView *)[dealerBtns objectAtIndex:[table getButtonSeat]])) { ((UIView *)[dealerBtns objectAtIndex:[table getButtonSeat]]).center = location; } } -(void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event { UITouch *touch = [touches anyObject]; CGPoint location = [touch locationInView:self.view]; UIView *endView = [self.view hitTest:location withEvent:nil]; if (touch.view == ((UIView *)[dealerBtns objectAtIndex:[table getButtonSeat]])) { NSLog(@"%u %u",endView.tag, touch.view.tag); if([buttons containsObject:(UIButton *)endView]) { [[dealerBtns objectAtIndex:[table getButtonSeat]] setHidden:YES]; [table passButton:touch.view.tag]; [[dealerBtns objectAtIndex: touch.view.tag] setHidden:NO]; } ((UIView *)[dealerBtns objectAtIndex:[table getButtonSeat]]).center = dealerBtnOrigin; } }


En general, debe tomar el punto donde terminó el toque y determinar si está dentro de la vista que le interesa. Hago esto utilizando un código similar al siguiente:

CGPoint newCenter = dragView.center; for (UIView *v in dropTargets) { CGRect convertedTargetFrame = [v.superview convertRect:v.frame toView:nil]; if (CGRectContainsPoint(convertedTargetFrame, newCenter)) { activeTargetIndex = idx; } }

(este código se editó sobre la marcha para eliminar muchas cosas irrelevantes, pero tengo una lista de posibles objetivos de caída en dropTargets, y esto es solo mirar esa lista para ver cuál de las UIViews potenciales podría contener el punto).

Lo esencial es que si conoce la vista o las vistas a las que potencialmente está arrastrando el elemento, entonces puede determinar si el marco de esa vista contiene el punto usando CGRectContainsPoint. Lo importante es tener en cuenta que pueden estar en diferentes sistemas de coordenadas y puede ser necesario convertir de uno a otro antes de su comparación.


Suponiendo que existe una @property de la vista de destino en su contenedor, y la vista de destino se agrega al contenedor:

@property (nonatomic, strong) UIView* targetView; // ... - (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event { NSSet* touchesForTargetView = [event touchesForView:self.targetView]; if (touchesForTargetView.allObjects.count != 0) { // touch was at target view } else { // touch was somewhere else } }


Swift 4:

anular funciones de toqueEnded (_ touches: Set, with event: UIEvent?) {

if let touch = touches.first{ let location = touch.location(in: self.view) let v = touch.view

// seguir.. }

}


Utilice la prueba de golpe. Conoces la ubicación de este punto como un CGPoint en términos de la vista supervisada definitiva, self.view . Luego puedes preguntarte a self.view cuál de sus subvistas se encuentra ese punto:

CGPoint location = [touch locationInView:self.view]; UIView* v = [self.view hitTest:location withEvent:nil];

El UIView v es la vista que estás buscando.


Es muy fácil detectar su vista finalmente tocada, pruebe este código

-(void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event { CGPoint location = [[touches anyObject] locationInView:self.view]; CGRect fingerRect = CGRectMake(location.x-5, location.y-5, 10, 10); for(UIView *view in self.view.subviews){ CGRect subviewFrame = view.frame; if(CGRectIntersectsRect(fingerRect, subviewFrame)){ //we found the finally touched view NSLog(@"Yeah !, i found it %@",view); } } }