2010-12-16 7 views

Respuesta

16

Sí, es razonablemente fácil implementar esto utilizando un UILongPressGestureRecognizer (en iPhone OS 3.2+). Una pulsación larga será manejada por el reconocedor de gestos, y un toque corto pasará a la acción normal del botón.

Por ejemplo, una subclase UIButton y añade el siguiente método para especificar una acción de toque largo para ir junto con un grifo (longPressGestureRecognizer es una variable de instancia):

- (void)setLongTouchAction:(SEL)newValue 
{ 
    if (newValue == NULL) 
    { 
     [self removeGestureRecognizer:longPressGestureRecognizer]; 
     [longPressGestureRecognizer release]; 
     longPressGestureRecognizer = nil; 
    } 
    else 
    { 
     [longPressGestureRecognizer release]; 
     longPressGestureRecognizer = nil; 

     longPressGestureRecognizer = [[UILongPressGestureRecognizer alloc] initWithTarget:[[self allTargets] anyObject] action:newValue]; 
     [self addGestureRecognizer:longPressGestureRecognizer]; 
    } 
} 

Entonces podría hacer lo siguiente para establecer tanto a corto grifo y acciones de prensa largas que será manejado por el mismo objetivo:

[undoButton addTarget:self action:@selector(performUndo:) forControlEvents:UIControlEventTouchUpInside]; 
[undoButton setLongTouchAction:@selector(showUndoOptions:)]; 

Como se puede ver, esto es útil para deshacer los botones que se ven en las barras de título de muchas aplicaciones de iPad.

+0

¿Puedo usar longPressGestureRecognizer en Cocos2D o Box2D juego. En mi juego, necesito variar el salto del jugador en función de la duración del toque en la pantalla? ¿O qué más puede ser mi solución? – Nitish

4

La mejor solución que se me ocurre es crear otra clase y UIButton de subclase. Luego, en Interface Builder (si eso es lo que estás usando), puedes establecer la clase del botón en la clase personalizada que acabas de crear.

Así que en esta nueva clase, usted tiene que reemplazar un método llamado

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

Esto es, básicamente, que le dice que alguien apretó el botón. Los toques son un NSSet y contienen toda la información de todos los dedos que presionan la pantalla. Si sólo está interesado en la que está presionando sobre el botón en sí, es probable que tenga algo como:

NSSet *myTouches = [event touchesForView:self.view]; 

Así que ahora que usted tiene los detalles que corresponden a su botón, usted tiene que averiguar cuántas veces que el usuario hizo clic en ese botón. Haga eso con algo como:

NSUInteger numTaps = [[myTouches anyObject] tapCount]; 

Si este número es 2, significa que el usuario simplemente presiona dos veces su botón. Ahora viene la siguiente parte. ¿Cómo sabes si el usuario está presionando ese botón? Bueno, cuando el usuario suelta la pantalla, se llama a otro método. Tendrá que anular que uno así:

- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event 

Aquí es donde se sabe si la persona ha dejado de tocar la pantalla o si el dedo está todavía en él. Si su dedo todavía está en él, entonces este evento aún no se ha convocado.

Ahora basta con el fondo

aquí está mi sugerencia para usted. Le sugiero que anule el método touchesBegan: y compruebe si el número de toques en el botón es 2. Si es así, inicie un temporizador que haga lo que necesita hacer, durante el tiempo que lo necesite y luego en el método ToquesEntrada, continuará y detendrá ese temporizador, y de esta manera habrá hecho lo que sea necesario, mientras lo necesite o mientras el usuario lo haya retenido. al botón.

Espero que esto ayude, obviamente, no escribí todo el código para usted, tendrá que experimentar e investigar esas cosas, pero si tiene alguna pregunta, con gusto le echaré una mano:)

8

La respuesta de Brad Larson parece bastante buena, pero aquí hay otra que podría darle un poco más de flexibilidad/control de lo que quiere o puede querer hacer.

subclase UIButton, anula el touchesBegan y touchesEnded métodos para que cuando el usuario inicia un toque de llamar

[self performSelector:@selector(detecetedLongTap) withObject:nil afterDelay:1.0]; 

y en el touchesEnded llame:

[NSObject cancelPreviousPerformRequestsWithTarget:self selector:@selector(detecetedLongTap) object:nil]; 

de cancelar el evento si el dedo fue levantado demasiado pronto.

Puede obtener el código completo para esto en esta entrada del blog:

http://www.isignmeout.com/adding-long-tap-functionality-uibutton/

+0

Además, esta es la única manera que funcionaría para aquellos que se dirigen a las versiones de iPhone OS anteriores a 3.2. Los reconocedores de gestos como los que solía no existían antes en el sistema operativo. –

Cuestiones relacionadas