2012-02-23 19 views
15

Estoy trabajando en un juego en el que un atributo de un objeto de juego se establece presionando durante mucho tiempo el objeto mismo. El valor del atributo está determinado por la duración del gesto de presión prolongada. Estoy usando UILongPressGestureRecognizer para este fin, por lo que es algo como esto:iOS: ¿Cómo obtener la duración del gesto de presión prolongada?

[gameObjectView addGestureRecognizer:[[UILongPressGestureRecognizer alloc] 
             initWithTarget:self action:@selector(handle:)]]; 

A continuación, la función de controlador

- (void)handle:(UILongPressGestureRecognizer)gesture { 
    if (gesture.state == UIGestureRecognizerStateEnded) { 
    // Get the duration of the gesture and calculate the value for the attribute 
    } 
} 

¿Cómo consigo la duración del tiempo gesto de prensa en este caso?

Respuesta

26

Estoy bastante seguro de que el gesto no almacena esta información para que pueda acceder. Solo puede establecer una propiedad llamada minimumPressDuration que es la cantidad de tiempo antes de que se reconozca el gesto.

Solución con iOS 5 (no probado):

Crear una propiedad NSTimer llamado temporizador: @property (nonatomic, strong) NSTimer *timer;

y un contador: @property (nonatomic, strong) int counter;

Entonces @synthesize

- (void)incrementCounter { 
    self.counter++; 
} 

- (void)handle:(UILongPressGestureRecognizer)gesture { 
    if (gesture.state == UIGestureRecognizerStateBegan) { 
     self.counter = 0; 
     self.timer = [NSTimer scheduledTimerWithTimeInterval:1 target:self selector:@selector(incrementCounter) userInfo:nil repeats:yes]; 
    } 
    if (gesture.state == UIGestureRecognizerStateEnded) { 
     [self.timer invalidate]; 
    } 
} 

Por eso, cuando el gesto comienza a iniciar un temporizador que dispara el método de incremento cada segundo hasta que finaliza el gesto s. En este caso, querrás configurar el minimumPressDuration en 0, de lo contrario, el gesto no comenzará de inmediato. ¡Entonces haz lo que quieras con el contador!

+0

¿Hay alguna solución para obtener la duración del gesto? –

+0

Verifica el código de arriba. ¡Espero que te sirva! Si no está utilizando iOS 5, es posible que deba hacer algunos cambios. –

+0

Estaba evitando crear una propiedad solo para este propósito, pero supongo que no hay otra manera. Uso NSDate en lugar de NSTimer para que el código pueda ser más limpio. ¡Gracias por tu respuesta! –

2

Consulte la propiedad "minimumPressDuration". Según la documentación:

Los dedos del período mínimo deben presionar en la vista para que se reconozca el gesto a .

[...]

El intervalo de tiempo es en segundos. La duración predeterminada es 0.5 segundos.

+0

La pregunta se refiere a la duración, es decir, el tiempo que el usuario tuvo su dedo hacia abajo, minimumPressDuration es para ajustar el retardo antes que se active el gesto. –

1

Sé que esta es una respuesta tardía, pero esto funciona perfectamente para mí en IOS 7 & 8 sin tener que crear un temporizador.

UILongPressGestureRecognizer *longGR = [[UILongPressGestureRecognizer alloc] initWithTarget:self action:@selector(yourAction)]; // create the recognizer 
longGR.minimumPressDuration = 10.0f; //Ten Seconds 
longGR.allowableMovement = 50.0f; //Allowable Movement while being pressed 
[gameObjectView setUserInteractionEnabled:YES]; //If setting interaction to a non-interactable object such as a UIImageView 
[gameObjectView addGestureRecognizer:longGR]; //Add the gesture recognizer to your object 
5

Parece, con mucho, la solución más limpia y sencilla orientada a objetos en Cocoa Touch es una subclase UILongPressGesture. Aquí hay un ejemplo escrito en Swift.

class MyLongPressGesture : UILongPressGestureRecognizer { 
     var startTime : NSDate? 
    } 

    func installGestureHandler() { 
      let longPress = MyLongPressGesture(target: self, action: "longPress:") 
      button.addGestureRecognizer(longPress) 
    } 

    @IBAction func longPress(gesture: MyLongPressGesture) { 
      if gesture.state == .Began { 
        gesture.startTime = NSDate() 
      } 
      else if gesture.state == .Ended { 
        let duration = NSDate().timeIntervalSinceDate(gesture.startTime!) 
        println("duration was \(duration) seconds") 
      } 
    } 

Si desea incluir el tiempo desde el primer grifo, se puede incluir cuando se calcula la duración, volviendo a añadir gesture.minimumPressDuration. El inconveniente es que probablemente no sea micro-segundo preciso, dado que es probable que transcurra una pequeña (minúscula) cantidad de tiempo entre el gesto que se activa y el controlador .Start que se está llamando. Pero para la gran mayoría de las aplicaciones, eso no debería importar.

6

No se necesitan temporizadores.Se puede lograr de esta manera:

- (void)handleRecognizer:(UILongPressGestureRecognizer *)gesture 
{ 
    static NSTimeInterval pressStartTime = 0.0; //This an be moved out and be kept as a property 

    switch ([gesture state]) 
    { 
     case UIGestureRecognizerStateBegan: 
      //Keeping start time... 
      pressStartTime = [NSDate timeIntervalSinceReferenceDate]; 
      break; /* edit*/ 
     case UIGestureRecognizerStateEnded: 
     { 
      //Calculating duration 
      NSTimeInterval duration = [NSDate timeIntervalSinceReferenceDate] - pressStartTime; 
      //Note that NSTimeInterval is a double value... 
      NSLog(@"Duration : %f",duration); 
      break; 
     } 
     default: 
      break; 
    } 
} 

Tampoco se olvide de establecer el gesto de minimumPressDuration a 0 reconocedor mientras que la creación, si desea obtener la duración real de la pulsación larga:
myLongPressGestureRecognizer.minimumPressDuration = 0

1

se puede conseguir siguiendo en Swift lógica 3,0

: Sólo asignando el momento de la prensa y encontrar la diferencia de tiempo WH en contacto termina

Código:

//variable to calculate the press time 
static var pressStartTime: TimeInterval = 0.0 

func handleRecognizer(gesture: UILongPressGestureRecognizer) -> Double { 
    var duration: TimeInterval = 0 

    switch (gesture.state) { 
    case .began: 
     //Keeping start time... 
     Browser.pressStartTime = NSDate.timeIntervalSinceReferenceDate 

    case .ended: 
     //Calculating duration 
     duration = NSDate.timeIntervalSinceReferenceDate - Browser.pressStartTime 
     //Note that NSTimeInterval is a double value... 
     print("Duration : \(duration)") 

    default: 
     break; 
    } 

    return duration 
} 
Cuestiones relacionadas