首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用UITapGestureRecognizer

使用UITapGestureRecognizer
EN

Stack Overflow用户
提问于 2010-10-23 06:00:29
回答 1查看 16.5K关注 0票数 4

iPhone开发新手。我有一个视图,其中包含一个包含UIImageView的UIScrollView。我在图像视图上添加了一个(双击)手势识别器,它会打开一个警告框。因为某些原因,我确信我只是智障,它打开了3次。

下面是我的代码:

代码语言:javascript
复制
- (void)viewDidLoad {

    scrollView.delegate = self;

    UIImage* image = imageView.image;
    imageView.bounds = CGRectMake(0, 0, image.size.width, image.size.height);
    scrollView.contentSize = image.size;

    UITapGestureRecognizer *tapGesture = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(handleTapGesture:)];
    tapGesture.numberOfTapsRequired = 2;
    [imageView addGestureRecognizer:tapGesture];
    [tapGesture release];

    NSLog(@"LOADED");

    [super viewDidLoad];
}

-(IBAction) handleTapGesture:(UIGestureRecognizer *) sender {
    CGPoint tapPoint = [sender locationInView:imageView];
    int tapX = (int) tapPoint.x;
    int tapY = (int) tapPoint.y;
    NSLog(@"TAPPED X:%d Y:%d", tapX, tapY);
    UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Hello" message:@"How are you?" delegate:nil cancelButtonTitle:@"I'm awesome." otherButtonTitles:nil];
    [alert show];
    [alert release];
}

我几天前才开始使用iPhone开发工具。这个问题让我想起了我在javascript中处理过的事件冒泡问题。有什么想法吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2010-10-23 06:29:00

不确定确切的原因是什么,但UIAlertView以某种方式导致手势再次触发。解决方法是使用performSelector在手势处理程序外部执行显示:

代码语言:javascript
复制
-(void) handleTapGesture:(UIGestureRecognizer *) sender {
    CGPoint tapPoint = [sender locationInView:imageView];
    int tapX = (int) tapPoint.x;
    int tapY = (int) tapPoint.y;
    NSLog(@"TAPPED X:%d Y:%d", tapX, tapY);
    [self performSelector:@selector(showMessage) withObject:nil afterDelay:0.0];
}

- (void)showMessage
{
    UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Hello" message:@"How are you?" delegate:nil cancelButtonTitle:@"I'm awesome." otherButtonTitles:nil];
    [alert show];
    [alert release];
}

编辑:

手势识别器在手势中经历不同的状态(开始、更改等),并在每次状态更改时调用处理程序方法。因此,一个更好也可能是正确的解决方案是检查处理程序顶部的手势识别器的状态属性:

代码语言:javascript
复制
-(void) handleTapGesture:(UIGestureRecognizer *) sender {
    if (sender.state != UIGestureRecognizerStateEnded)  // <---
        return;                                         // <---

    CGPoint tapPoint = [sender locationInView:imageView];
    int tapX = (int) tapPoint.x;
    int tapY = (int) tapPoint.y;
    NSLog(@"TAPPED X:%d Y:%d", tapX, tapY);

    UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Hello" message:@"How are you?" delegate:nil cancelButtonTitle:@"I'm awesome." otherButtonTitles:nil];
    [alert show];
    [alert release];
}
票数 10
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4001284

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档