尝试获取触摸点,返回NaN。

3

好的,我在这里遇到了一个非常奇怪(对我来说)的问题。我的视图中有一个150x150的按钮,我已经给该按钮添加了一个UILongPressGestureRecognizer,因为我需要在按钮按下时获取按钮被按下的位置。我用以下代码实现:

-(CGPoint)detectedTouch:(UILongPressGestureRecognizer *)sender { 

    CGPoint touchPoint = [sender locationInView:button];
    return touchPoint;
}


-(void)myAction {

    CGPoint touchPoint = [self detectedTouch:myGestureRecognizer];  
    NSLog(@"touchPoint = %f, %f", touchPoint.x, touchPoint.y);

    //do stuff
}

当按钮在普通视图上时,一切都正常工作。但是当按钮在scrollView上时,只有当您按下它约一秒钟时才能正常工作。如果您释放得太快,日志将给出以下信息:

touchPoint = nan, nan

任何帮助解决这个问题的意见都将不胜感激!
2个回答

2
“UIGestureRecognizer”在其生命周期中有各种状态,例如“possible”(可能)、“recognized”(已识别)、“failed”(失败)、“ended”(结束)和“canceled”(取消)。我建议在您的识别器方法中加入一个switch语句来判断状态,并查看发生了什么以更好地缩小问题范围。代码如下:
switch (sender.state){
    case  UIGestureRecognizerStatePossible:
        NSLog(@"possible");
        break;
    case  UIGestureRecognizerStateFailed:
        NSLog(@"Failed!");
        break;
    ... All Cases wanted
    default:
        break;
}

我不知道内部细节,但如果它失败/取消,可能无法在视图中获取位置。
这是有关子类化手势识别器和可能发生的状态的文档。

http://developer.apple.com/library/IOs/#documentation/UIKit/Reference/UIGestureRecognizer_Class/Reference/Reference.html


好的,谢谢你,但是我的问题与scrollView有关。获取触摸点的目的是根据触摸位置以不同的方式对按钮进行动画处理。只是为了测试,我删除了检查触摸位置的部分,并在按下按钮时将其沿y轴向下移动,一旦不再按下就将其移回原始位置。在常规视图上,它的工作正常,但在scrollView上,它只能在延迟后(如上所述)工作,并且动画不流畅。有什么想法吗? - kopproduction

0

我尝试重现你的问题,但是没有成功。起初,我认为手势识别器可能会干扰scrollView滚动手势识别器,但似乎并非如此。下面是我的代码:

- (void)viewDidLoad
{
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.
    UILongPressGestureRecognizer *recognizer = [[UILongPressGestureRecognizer alloc] initWithTarget:self action:@selector(handleLongHold:)];
//    [scrollView addGestureRecognizer:recognizer];
    UILabel *lbl = [[UILabel alloc] initWithFrame:CGRectMake(0, 0, 100, 2000)];
    lbl.text = @"lorem ipsum......";
    lbl.numberOfLines = 0;
    scrollView.contentSize = CGSizeMake(lbl.frame.size.width, lbl.frame.size.height);
    [scrollView addSubview:lbl];
    btn = [UIButton buttonWithType:UIButtonTypeRoundedRect];
    btn.frame = CGRectMake(0, 0, 150, 150);
    [btn addGestureRecognizer:recognizer];
    [scrollView addSubview:btn];

    v = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 50, 50)];
    v.backgroundColor = [UIColor yellowColor];
    v.hidden = YES;
    [scrollView addSubview:v];
}

- (void) handleLongHold:(UILongPressGestureRecognizer*) recognizer {
    NSLog(@"long tap handled");
    v.hidden = NO;
    v.center = [recognizer locationInView:btn];
}

顺便说一句,我在寻找手势识别选择器的触点时偶然发现了你的问题 - locationInView方法帮助了我,希望这段代码也能对你有所帮助。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接