我有一个按钮。我想在初次触摸时更改图像。如果触摸少于 1 秒,我希望它做 X。如果触摸时间长于 1 秒,我希望它做 Y。
我很难弄清楚如何处理这个问题。事实证明,UIButton很麻烦,所以我认为我可以用UIGestureRecognizers
或touchesBegin:
来做到这一点
最初的想法是有一个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 秒的延迟。让我感到困惑的是,如果我将UILongPressGestureRecognizer
与longTap.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
}