2011-09-10 12 views
28

Así que tengo un gran UIButton, es un , y el objetivo del botón se llama para UIControlEventTouchUpInside. Mi pregunta es cómo puedo determinar dónde en el UIButton se produjo el toque. Quiero esta información para poder mostrar una ventana emergente desde la ubicación táctil. Esto es lo que he intentado:UIButton TouchUpInside Touch Ubicación

UITouch *theTouch = [touches anyObject]; 
CGPoint where = [theTouch locationInView:self]; 
NSLog(@" touch at (%3.2f, %3.2f)", where.x, where.y); 

y varias otras iteraciones. método de destino del botón Obtener información en ella a través del sender:

UIButton *button = sender; 

Entonces, ¿hay alguna manera de que pudiera usar algo como: button.touchUpLocation?

Miré en línea y no pude encontrar nada similar a esto, así que gracias de antemano.

+0

No hay touchUpLocation, UIButton es un control que no se puede obtener la ubicación de UIButton clic. http://developer.apple.com/library/ios/#DOCUMENTATION/UIKit/Reference/UIButton_Class/UIButton/UIButton.html –

+1

No quise decir literalmente touchUpLocation, quise decir algo así – Andrew

+2

@ Praveen-K, eso es incorrecto . UIKit admite acciones que toman un segundo parámetro, el UIEvent que desencadenó la acción. De eso puedes obtener la lista de toques, y cada toque tiene una ubicación. Ver el código que publiqué a continuación. Es cierto que UIButton no tiene un método que devuelva la ubicación del último clic, sin embargo. – Caleb

Respuesta

56
UITouch *theTouch = [touches anyObject]; 
CGPoint where = [theTouch locationInView:self]; 
NSLog(@" touch at (%3.2f, %3.2f)", where.x, where.y); 

Esa es la idea correcta, excepto que este código es probablemente el interior de una acción en el controlador de vista, ¿verdad? Si es así, entonces self se refiere al controlador de vista y no al botón. Debería pasar un puntero al botón en -locationInView:.

Aquí es una acción probado que puede probar en su controlador de vista:

- (IBAction)buttonPressed:(id)sender forEvent:(UIEvent*)event 
{ 
    UIView *button = (UIView *)sender; 
    UITouch *touch = [[event touchesForView:button] anyObject]; 
    CGPoint location = [touch locationInView:button]; 
    NSLog(@"Location in button: %f, %f", location.x, location.y); 
} 
+1

Gracias que resolvió completamente mi problema. Pensé que no se podía hacer, así que esto es genial. – Andrew

+1

Qué buen fragmento de código: a veces aparecen estas cosas que reafirman tu creencia en la naturaleza humana :-) – SomaMan

+0

¿Hay alguna manera de obtener el evento de '- (IBAction) buttonPressed: (id) sender' ...? (Es decir, tengo un gran proyecto y me gustaría contaminar esto, sin cambiar todos los botones a '... forEvent:', si puedo) ¡Gracias! – Olie

0

¿Intentó agregar un reconocedor de gestos a su botón?

+0

No lo intenté porque en mis experiencias pasadas con los reconocedores de gestos, no funcionan con las subvistas. Sin embargo, estoy seguro de que estaba haciendo algo mal. Pero no parecía una situación de gesto. Quería saber cuándo se presionó el botón, no como cuando se tocó una vista. Pero gracias por su respuesta – Andrew

+0

@ Jean-Denis Muys Esta respuesta debe ser un comentario, a menos que va a dar detalles de su sugerencia. Además, creo que la respuesta actualizada en este caso es más apropiada, sin embargo, agregar un reconocedor de gestos debería ser una solución cohesiva. Configurarlos correctamente debería funcionar igual que usar un evento. También –

4

para SWIFT 3.0:

@IBAction func buyTap(_ sender: Any, forEvent event: UIEvent) 
{ 
     let myButton:UIButton = sender as! UIButton 
     let touches: Set<UITouch>? = event.touches(for: myButton) 
     let touch: UITouch? = touches?.first 
     let touchPoint: CGPoint? = touch?.location(in: myButton) 
     print("touchPoint\(touchPoint)") 
}