2009-03-10 51 views
23

Tengo varios UIButton s que utilizo para establecer la acción actual al tocar en el área principal. También me gustaría permitir que el usuario arrastre desde el botón directamente al área principal y realice la misma acción; esencialmente, los toques Bean y touchesMoved se deben pasar a la vista principal al tocar los UIButtons, pero también deben enviar la acción de presionar el botón.¿Hay alguna forma de pasar el iPhone?

En este momento, tengo el toque dentro cambiando el control. La salida de arrastre llama a la sección retocar adentro para establecer el control, luego llama a la sección de inicio de toques para iniciar la operación de tocar el área principal.

Sin embargo, en este punto, los toquesMoved y touchesEnded obviamente no se están llamando, porque los toques se originaron en el UIButton.

¿Hay alguna manera de ignorar a la mitad los toques para que pasen al área principal, pero también me permiten establecer el control primero?

Respuesta

24

En la documentación, busque Responder Objects and the Responder Chain

Se puede "compartir" toca entre objetos mediante el envío del tacto en la cadena de respuesta. Su UIButton tiene un respondedor/controlador que recibe los eventos UITouch, supongo que una vez que ha completado su interpretación del mensaje que devuelve, el toque ha sido manipulado y desechado.

de Apple sugiere algo como esto (en función del tipo de contacto, por supuesto):

[self.nextResponder touchesBegan:touches withEvent:event];

En lugar de desechar el caso del tacto que se transmite.

Sub clasificado UIButton:

MyButton.h

#import <Foundation/Foundation.h> 

@interface MyButton : UIButton { 

} 
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event ; 

@end 

MyButton.m

#import "MyButton.h" 

@implementation MyButton 

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event { 
    printf("MyButton touch Began\n"); 
    [self.nextResponder touchesBegan:touches withEvent:event]; 
} 
@end 
+0

Entonces, en este caso, tendría que subclase UIButton para pasar los toques, supongo? –

+0

Las subclases no deberían ser necesarias, necesitará explorar la cadena un poco. La vista o el control que contiene su botón será el siguiente respondedor en la cadena. – Paxic

+1

Me temo que no veo cómo atrapar mensajes del UIButton y pasarlos a UIView sin subclasificar el UIButton para obtener realmente el mensaje. –

35

Sé que esta pregunta es de dos años (y ya ha respondido), pero sin embargo ...

Cuando probé esto, los toques fueron reenviados, pero los botones ya no se comportaban como botones. También pasé los toques a "super" y ahora todo está bien.

Por lo tanto, para los principiantes que podrían tropezar con esto, esto es lo que el código debería ser similar:

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event { 
    [super touchesBegan:touches withEvent:event]; 
    [self.nextResponder touchesBegan:touches withEvent:event]; 
} 
+0

¡Fantástico! ¡Estaba teniendo exactamente el mismo problema y esto lo resolvió! ¡Voto dado! – EmphaticArmPump

+2

¿Este método estaría en la subclase de UIButton? –

+1

Sí, se usaría en una subclase de UIButton. – daveMac

17

No hay necesidad de subclase, ya sea! Simplemente pegue esto en la parte superior de su implementación antes que nada:

#pragma mark PassTouch 

@interface UIButton (PassTouch) 
@end 

@implementation UIButton (PassTouch) 
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event 
{ 
    [super touchesBegan:touches withEvent:event]; 
    [self.nextResponder touchesBegan:touches withEvent:event]; 
} 
- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event 
{ 
    [super touchesMoved:touches withEvent:event]; 
    [self.nextResponder touchesMoved:touches withEvent:event]; 
} 
- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event 
{ 
    [super touchesEnded:touches withEvent:event]; 
    [self.nextResponder touchesEnded:touches withEvent:event]; 
} 
- (void)touchesCancelled:(NSSet *)touches withEvent:(UIEvent *)event 
{ 
    [super touchesCancelled:touches withEvent:event]; 
    [self.nextResponder touchesCancelled:touches withEvent:event]; 
} 
@end 
+0

Funciona como un encanto :-) ¡Muchas gracias! –

+3

BTW todavía puede haber una necesidad de subclase. Por ejemplo, ¿qué pasa si necesitas mezclar botones que necesitan pasar toques en la misma vista con botones que por alguna razón no quieres tener esa funcionalidad? Cuando probé esto por primera vez, creé una categoría en UIButton, pero descubrí que debido a la razón que expuse anteriormente, era más seguro usar una subclase, así que sé exactamente cuándo estoy usando un botón que remite los toques. – daveMac

+1

Además, debe hacer lo mismo con 'touchesCancelled'. –

Cuestiones relacionadas