2012-02-23 13 views
15

Pracuję nad grą, w której atrybut obiektu gry jest ustawiany przez długie naciśnięcie samego obiektu. Wartość atrybutu jest określona przez czas trwania długiego naciśnięcia gestu. Używam UILongPressGestureRecognizer do tego celu, więc jest to coś takiego:iOS: Jak uzyskać czas trwania długiego naciśnięcia gestu?

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

Następnie funkcja obsługi

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

Jak uzyskać czas trwania długiego prasy gest w tym przypadku?

Odpowiedz

26

Jestem prawie pewien, że gest nie przechowuje tych informacji, aby uzyskać do nich dostęp. Można ustawić tylko właściwość o nazwie minimumPressDuration, która jest ilością czasu przed rozpoznaniem gestu.

Obejście z iOS 5 (nietestowane):

Załóż nieruchomości NSTimer nazwie Timer: @property (nonatomic, strong) NSTimer *timer;

i licznik: @property (nonatomic, strong) int counter;

Następnie @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]; 
    } 
} 

Więc kiedy gest rozpoczyna uruchamianie minutnika, który uruchamia inkrementację co sekundę, aż do zakończenia gestu s. W takim przypadku należy ustawić wartość minimumPressDuration na 0, w przeciwnym razie gest nie rozpocznie się od razu. Następnie rób, co chcesz z licznikiem!

+0

Czy istnieje sposób obejścia tego gestu? –

+0

Sprawdź powyższy kod. Mam nadzieję, że to zadziała dla Ciebie! Jeśli nie korzystasz z systemu ios 5, być może trzeba wprowadzić pewne zmiany. –

+0

Unikałem tworzenia nieruchomości tylko w tym celu, ale myślę, że nie ma innego sposobu. Używam NSDate zamiast NSTimer, więc kod może być czystszy. Dzięki za odpowiedź! –

2

Zobacz właściwość "minimalPressDuration". Zgodnie z dokumentacją:

Uznane muszą być minimalne palce palców na widoku, aby można je było rozpoznać na .

[...]

Przedział czasu jest podawany w sekundach. Domyślny czas trwania to 0,5 sekund.

+0

pytanie jest o czas, to znaczy jak długo użytkownik wstrzymali palec w dół, minimumPressDuration umożliwia ustawienie opóźnienia, zanim zostanie wywołany gest. –

1

Wiem, że to późna odpowiedź, ale działa to doskonale w IOS 7 & 8 bez konieczności tworzenia licznika czasu.

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

Wydaje zdecydowanie najczystsze i najprostsze rozwiązanie w obiektowego Cocoa Touch jest do podklasy UILongPressGesture. Oto przykład napisany w 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") 
      } 
    } 

Jeśli chcesz to czas od pierwszego kranu, można dołączyć go podczas obliczania czasu trwania, dodając z powrotem gesture.minimumPressDuration. Wadą jest to, że prawdopodobnie nie jest to dokładność mikro-sekundowa, biorąc pod uwagę, że prawdopodobnie upłynie mały (malutki) czas pomiędzy wyzwalanym gestem a wywołanym programem obsługi .Start. Ale dla ogromnej większości aplikacji, które nie powinny mieć znaczenia.

6

Nie ma potrzebnych timerów.Można to osiągnąć w ten sposób:

- (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; 
    } 
} 

Również nie zapomnij ustawić gest rozpoznawania użytkownika minimumPressDuration do 0 podczas tworzenia go, jeśli chcesz uzyskać prawdziwe trwania długie naciśnięcie:
myLongPressGestureRecognizer.minimumPressDuration = 0

1

można ją uzyskać, wykonując w Swift 3.0

Logic: Wystarczy przypisanie czasu prasie i zobaczyć różnicę WH czasowych pl dotykowy kończy

Kod:

//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 
} 
Powiązane problemy