使用触摸的问题开始



我有一个按钮。我想在初次触摸时更改图像。如果触摸少于 1 秒,我希望它做 X。如果触摸时间长于 1 秒,我希望它做 Y。

我很难弄清楚如何处理这个问题。事实证明,UIButton很麻烦,所以我认为我可以用UIGestureRecognizerstouchesBegin:来做到这一点

最初的想法是有一个UITapGestureRecognizer,只需快速点击即可检测到执行 X,并使用UILongTapGestureRecognizer来处理较长的按压以执行 Y。

问题是UITapGestureRecognizer不标记UIGestureRecognizerStateBegan,它只会发送通知UIGestureRecognizerStateEnd

所以我决定尝试覆盖touchesBegin:touchesEnd:方法并使用UILongPressGestureRecognizer

-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
    // change image
}
-(void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event {
    // do X
    // change image to original image
}
-(IBAction)longPressDetected:(UILongPressGestureRecognizer *)recognizer {
    DLog(@"fired");
    if (recognizer.state == UIGestureRecognizerStateBegan) {
        // Do y
        // change image to original image
    }
    else if (recognizer.state == UIGestureRecognizerStateCancelled) {
    }
    else if (recognizer.state == UIGestureRecognizerStateEnded) {
    }
}

如果UILongPressGestureRecognzier触发,它将取消初始touchesBegan:(不会触发touchesEnded:方法)。

但是我遇到了touchesBegin:方法触发缓慢的问题。触发的方法有 .5 秒的延迟。让我感到困惑的是,如果我将UILongPressGestureRecognizerlongTap.minimumPressDuration = 0一起使用,它会立即触发。

这是在我需要它的程序中。在虚拟区域玩弄它,touchesBegins:也会立即发射。

什么可能导致它在程序中滞后?

有没有其他方法可以获得所需的效果?

也许您可以使用计时器和长按手势识别器

UILongPressGestureRecognizer *longPress = [[UILongPressGestureRecognizer alloc] initWithTarget:self action:@selector(didRecognizeLongPressGesture:)];
longPress.minimumPressDuration = 0;
[self.button addGestureRecognizer:longPress];

- (void)didRecognizeLongPressGesture:(UILongPressGestureRecognizer*)gesture
{
    static NSTimer *timer = nil;
    if (gesture.state == UIGestureRecognizerStateBegan)
    {
        timer = [NSTimer scheduledTimerWithTimeInterval:1.1 target:self selector:@selector(changeImage:) userInfo:nil repeats:NO];
        //change the image here
    }
    else if ( gesture.state == UIGestureRecognizerStateEnded)
    {
        if ([timer isValid])
        {
            //the user has pressed the button less than a second
            [timer invalidate];
            timer = nil;
        }
    }
}
- (void)changeImage:(NSTimer*)timer
{
    [timer invalidate];
    timer = nil;
    //change to the other image here
}

最新更新