在 UIPanGestureRecognizer 中使用velocityInView

Posted

技术标签:

【中文标题】在 UIPanGestureRecognizer 中使用velocityInView【英文标题】:Making use of velocityInView with UIPanGestureRecognizer 【发布时间】:2012-02-01 09:35:24 【问题描述】:

我有一个自定义滑块类型的对象,我希望它更有用。目前我使用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...            
        

    

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

【问题讨论】:

【参考方案1】:

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

坚持使用translationInView: 直到state 变为UIGestureRecognizerStateEnded,然后使用velocityInView: 为任何屏幕视图更改设置动画。

【讨论】:

在这种情况下,我想使用它来提高自定义滑块的拖动速度。例如,如果用户拖得很慢,我想每 5 像素距离将当前值增加 1,但如果用户拖得更快,我想每 5 像素距离将当前值增加 10。

以上是关于在 UIPanGestureRecognizer 中使用velocityInView的主要内容,如果未能解决你的问题,请参考以下文章

在 UILongPressGestureRecognizer 上启用 UIPanGestureRecognizer

UIPanGestureRecognizer 在视图中使用 UIScrollView

在播放 UIAnimation 时执行 UIPanGestureRecognizer

UIPanGestureRecognizer - ImageView 在平移后快速回到原始位置

UIPanGestureRecognizer 干扰滚动

UIPanGestureRecognizer 弹出 UIViewController