在UIPanGestureRecognizer中使用velocityInView

squ*_*rog 3 iphone objective-c uipangesturerecognizer

我有一个自定义滑块类型的对象,我希望它更有用.目前我使用UIPanGestureRecognizertranslationInView使其工作.它工作得很好,但我想在那里使用某种速度让它感觉更有用.我已经尝试了一些东西,但不能弄清楚如何正确实现速度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...            
        }

    }
}
Run Code Online (Sandbox Code Playgroud)

任何帮助将不胜感激.谢谢.

Ash*_*row 5

根据我的经验,在velocityInView:用户抬起手指并且识别器完成之前,平移手势识别器并不重要.此时,您可以使用力度来计算动画持续时间以移动视图.

只要坚持translationInView:,直到stateUIGestureRecognizerStateEnded,然后使用velocityInView:动画屏幕上的看法的变化.