我如何实现自己的"刷卡"手势识别器?

时间:2014-07-02 10:51:45

标签: ios objective-c uikit

我想知道我是不是太过于复杂了。首先,我想要自己的"刷卡"是获取滑动的开始和结束触摸,以及创建复合手势的能力(多次滑动将被识别为单个手势 - 例如:字形模式识别)。

无论如何,我在touchesMoved期间跟踪指标:但我没有一个好方法来确保用户的触摸是在一条线上,或者即使速度有效。我发现touchesMoved:callback提供了偏离一点点的触摸样本(touchesMoved:样本包含偏差超过50%)。我在touchesMoved中做到这一点的想法是双重的。一,确保滑动是直的,两个,以便在必要时取消手势。

这是我的感动移动:

- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event
{
    [super touchesMoved:touches withEvent:event];

    UITouch *currentTouch = (UITouch *)[touches anyObject];
    CGPoint curTouchPoint = [self.view.window
                             convertPoint:[currentTouch locationInView:self.view.window]
                             toWindow:nil];
    CGPoint prevTouchPoint = [self.view.window
                              convertPoint:[currentTouch previousLocationInView:self.view.window]
                              toWindow:nil];

    // Swipe and touch metrics    
    CGFloat touchLength = [SwipeGestureRecognizer lineDistanceForStartPoint:prevTouchPoint endPoint:curTouchPoint];
    CGFloat touchVelocity = touchLength / (currentTouch.timestamp - _prevTouchTime);
    CGFloat touchAngle = [SwipeGestureRecognizer angleForStartPoint:prevTouchPoint endPoint:curTouchPoint];

    CGFloat prevTouchVelocity = _prevTouchVelocity;
    _prevTouchVelocity *= _sampleWeight;
    _prevTouchVelocity += (1.0f - _sampleWeight) * touchVelocity;

    CGFloat prevTouchAngle = _prevTouchAngle;
    _prevTouchAngle *= _sampleWeight;
    _prevTouchAngle += (1.0f - _sampleWeight) * touchAngle;

    _prevTouchTime = currentTouch.timestamp;
}

此时我不确定如何"验证"滑动。我知道像速度这样的东西可能是主观的,但我希望你们中的一些专业人士之前已经做过这些并且有一些意见。

0 个答案:

没有答案