0

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

我很难弄清楚如何处理这个问题。UIButton 被证明很麻烦,所以我想我可以用UIGestureRecognizersortouchesBegin:

最初的想法是用 aUITapGestureRecognizer来检测快速点击来执行 X,然后使用 aUILongTapGestureRecognizer来处理更长的按下来执行 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:方法启动缓慢的问题。被触发的方法有 0.5 秒的延迟。让我感到困惑的是,如果我使用UILongPressGestureRecognizera longTap.minimumPressDuration = 0,它会立即触发。

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

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

有没有不同的方法可以获得预期的效果?

4

1 回答 1

2

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

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
}
于 2013-09-13T22:12:23.333 回答