ios - 如何仅查找 TouchMoved 上的向上滑动

标签 ios objective-c touch uigesturerecognizer touchesmoved

我目前正在使用touchesMoved来允许用户向上滑动,并且向上滑动的次数越多,数字增加就越大。我认为我不能在这里使用 UIGestureRecognizer,因为它不会记录每一个 Action - 它只会记录单次滑动。

这是我当前的代码:

-(void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event
{

    UITouch *touch = [touches anyObject];
    CGPoint gestureEndPoint = [touch locationInView:self.view];

    NSLog(@"START: %@  END: %@", NSStringFromCGPoint(gestureStartPoint), NSStringFromCGPoint(gestureEndPoint));

    if((gestureStartPoint.x - gestureEndPoint.x) < 20 && (gestureStartPoint.x - gestureEndPoint.x) > -20)
    {

        if((gestureStartPoint.y - gestureEndPoint.y) > (gestureStartPoint.x - gestureEndPoint.x))
        {

            if(gestureStartPoint.y > gestureEndPoint.y)
            {

                NSInteger integer =  (NSInteger)(gestureEndPoint.y - gestureStartPoint.y);

                NSString *string = [NSString stringWithFormat:@"%i", integer / 40];

                if([string intValue] && self.lastValue != [string intValue])
                {

                    [self.timer invalidate];

                    [self.updateCounter invalidate];

                    [self.secondsTimer invalidate];

                    self.lastValue = [string integerValue];

                    self.number = self.number + 1;

                    NSString *finalTime = [NSString stringWithFormat:@"%i", self.number];

                    if(self.number == 1)
                        finalTime = [finalTime stringByAppendingString:@" MINUTE"];

                    else
                        finalTime = [finalTime stringByAppendingString:@" MINUTES"];

                    [self.amountOfTime setText:finalTime];

                    lastPoint = gestureEndPoint;

                    NSLog(@"Setting timer for %i", self.number * 60);

                    self.timer = [NSTimer scheduledTimerWithTimeInterval:self.number * 60 target:self  selector:@selector(countdownEnded) userInfo:nil repeats:NO];
                    self.updateCounter = [NSTimer scheduledTimerWithTimeInterval:60 target:self  selector:@selector(updateCounterText) userInfo:nil repeats:YES];

                    CABasicAnimation *crossFade = [CABasicAnimation animationWithKeyPath:@"contents"];
                    crossFade.duration = 2.0;
                    crossFade.fromValue = (__bridge id)([self.background.image CGImage]);
                    crossFade.toValue = (__bridge id)([[UIImage imageNamed:@"MainBackground"] CGImage]);
                    crossFade.removedOnCompletion = NO;
                    crossFade.fillMode = kCAFillModeForwards;
                    [self.background.layer addAnimation:crossFade forKey:@"animateContents"];

                }

            }

            else
            {

                if(self.number - 1 >= 0)
                {

                    [self.timer invalidate];

                    [self.updateCounter invalidate];

                    [self.secondsTimer invalidate];

                    self.number = self.number - 1;

                    NSString *finalTime = [NSString stringWithFormat:@"%i", self.number];

                    if(self.number == 1)
                        finalTime = [finalTime stringByAppendingString:@" MINUTE"];

                    else
                        finalTime = [finalTime stringByAppendingString:@" MINUTES"];

                    [self.amountOfTime setText:finalTime];

                    lastPoint = gestureEndPoint;

                    NSLog(@"Setting timer for %i", self.number * 60);

                    self.timer = [NSTimer scheduledTimerWithTimeInterval:self.number * 60 target:self  selector:@selector(countdownEnded) userInfo:nil repeats:NO];
                    self.updateCounter = [NSTimer scheduledTimerWithTimeInterval:60 target:self  selector:@selector(updateCounterText) userInfo:nil repeats:YES];

                }

        else
            self.number = 0;

        }

    }

    }

}

问题是 - 如果从左到右或从右到左或从上到下滑动,数字会增加。我只希望 if 语句中的位能够拾取从下到上的滑动。我怎样才能做到这一点并消除所有其他滑动?

最佳答案

像这样吗?

-(void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event
{

    UITouch *touch = [touches anyObject];
    CGPoint gestureEndPoint = [touch locationInView:self.view];

    int dx = abs(gestureStartPoint.x - gestureEndPoint.x);
    int dy = -1 * (gestureEndPoint.y - gestureStartPoint.y);

    if(dx > 20) {
        // too much left/right, so don't do anything
        return;
    }

    if(dy < 0) {
        // they moved down
        return;
    }

    NSLog(@"Change in Y: %d", dy); // now do something with dy
    // ....

关于ios - 如何仅查找 TouchMoved 上的向上滑动,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14661894/

相关文章:

android - GestureDetector onScroll 的滚动延迟

iphone - UIButton 标题标签变换截断标签

ios - tableView.scrollToRow() 的替代品

ios - Swift 类属性引用点在 init 方法后消失

objective-c - 阻止 IKImageView 处理手势

ios - 当前导航 Controller 来自另一个导航 Controller

c# - Unity 滑动功能问题

ios - 禁用点击事件但不在 UIScrollView 上滚动

iphone - 如何在 iPhone 上扩展键盘渐变?

javascript - 缩放 SVG 模糊或像素化,不清晰