Использование speedInView с UIPanGestureRecognizer - PullRequest
3 голосов
/ 01 февраля 2012

У меня есть объект типа слайдера, который я хочу сделать более удобным.В настоящее время я использую UIPanGestureRecognizer и translationInView, чтобы заставить его работать.Это работает довольно хорошо, но я хотел бы, чтобы какая-то скорость была там, чтобы это было немного более полезным.Я попробовал несколько вещей, но не могу понять, как правильно реализовать уравнение скорости changedLevel.

- (void)panDetected:(UIPanGestureRecognizer *)gesture {

    CGPoint swipeLocation = [gesture locationInView:self.tableView];
    NSIndexPath *indexPath = [self.tableView indexPathForRowAtPoint:swipeLocation];
    LevelCounterTableCell *swipedCell = (LevelCounterTableCell *)[self.tableView cellForRowAtIndexPath:indexPath];

    if([gesture state] == UIGestureRecognizerStateBegan) {
        NSString *originalLevelString = swipedCell.levelNumber.text;
        originalLevel = [originalLevelString intValue]; // int originalLevel
    }

    if ([gesture state] == UIGestureRecognizerStateChanged) {

        CGFloat xTranslation = [gesture translationInView:[[gesture view] superview]].x;
        CGFloat xVelocity = [gesture velocityInView: [[gesture view] superview]].x;

        // Pan threshold is currently set to 8.0. 
        // 8.0 is a decent level for slow panning
        // for fast panning 2.0 is more reasonable
        changedLevel = ceilf((xTranslation / panThreshold) + originalLevel); // int changedLevel

        // Raw velocity seems to go from around 3 (slow)
        // to over 200 (fast)
        NSLog(@"raw velocity = %f", xVelocity);

        if (changedLevel >= 15 && changedLevel <= 100) {
            swipedCell.levelNumber.text = [NSString stringWithFormat:@"%i", changedLevel];
            swipedCell.meter.frame = [self updateMeter: changedLevel];

        }
    }

    if ([gesture state] == UIGestureRecognizerStateEnded || [gesture state] == UIGestureRecognizerStateCancelled) {
        if (changedLevel >= 15 && changedLevel <= 100) {
            //... Save the values...            
        }

    }
}

Любая помощь будет принята с благодарностью.Спасибо.

1 Ответ

5 голосов
/ 28 февраля 2012

По моему опыту, velocityInView: распознавателя жестов панорамирования не важен, пока пользователь не поднимет свои пальцы, и распознаватель не завершит работу. В этот момент вы можете использовать скорость для расчета продолжительности анимации для перемещения ваших видов.

Просто придерживайтесь translationInView:, пока state не станет UIGestureRecognizerStateEnded, а затем используйте velocityInView: для анимации любых изменений на экране.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...