Пытаясь получить точку соприкосновения, возвращает NaN - PullRequest
2 голосов
/ 03 декабря 2011

Хорошо, я столкнулся с очень странной (для меня) проблемой здесь.У меня есть кнопка 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 голосов
/ 03 декабря 2011

UIGestureRecognizer имеют различные состояния в своей жизни, такие как возможный, распознанный, сбойный, завершенный, отмененный.Я бы попробовал поместить оператор 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

0 голосов
/ 26 мая 2012

Я пытался воспроизвести вашу проблему, но безуспешно. Сначала я подумал, что распознаватель жестов может мешать распознавателю жестов прокрутки 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, и, надеюсь, этот код поможет вам.

...