2015-03-20 3 views
0

Я не могу понять, что я делаю неправильноПутаница UIGestures - приемники сообщений

Почему velocityInView:self.view & locationInView посылает UILongPressGestureRecognizer но не UIPanGestureRecognizer?

UILongPressGestureRecognizer *cursorMode = [[UILongPressGestureRecognizer alloc] 
              initWithTarget:self action:@selector(pan:)]; 
    cursorMode.minimumPressDuration = 0.35; 
    [self.Row2View addGestureRecognizer:cursorMode]; 


- (void)pan:(UIPanGestureRecognizer *)gesture { 

    float position = round([gesture locationInView:self.view].x); 
    NSLog(@"%f", position); 

    CGPoint velocity = [gesture velocityInView:self.view]; 

    if(velocity.x* _lastGestureVelocity.x > 0) 
    { 
     NSLog(@"gesture went in the same direction"); 
    } 
    else 
    { 
     NSLog(@"gesture went in the opposite direction"); 
    } 

    _lastGestureVelocity = velocity; 
} 

Ошибка: *** Согласующего приложения из-за неперехваченное исключение 'NSInvalidArgumentException', причина: '- [UILongPressGestureRecognizer velocityInView]: непризнанный селектор направлен например 0x6080001b0300'

ответ

1

Исправить, создав cursorMode в качестве распознавателя распознавания панорамы (что, я думаю, это то, что вы имеете в виду), или переименования метода pan: (to longPress :) и параметризации с помощью длинного нажатия gr.

Как она стоит сейчас, код выделяет длинный пресс-Gr:

UILongPressGestureRecognizer *cursorMode = [[UILongPressGestureRecognizer alloc] initWithTarget:self action:@selector(pan:)]; 

Но отбрасывает параметр pan: как UIPanGestureRecognizer, отправив ему сообщение velocityInView:. Это приведет к сбою во время выполнения, потому что, как вы указываете, оно отправляется на длинную печать gr.

EDIT - Основываясь на комментариях, кажется, что функциональная цель - отслеживать движение после того, как распознается длинное нажатие. Это может быть сделано без использования панорамирования жеста, сохраняя расположение заявить себя:

@property(assign,nonatomic) CGPoint lastLocation; 

UILongPressGestureRecognizer *cursorMode = [[UILongPressGestureRecognizer alloc] initWithTarget:self action:@selector(longPress:)]; 
cursorMode.minimumPressDuration = 0.35; 
[self.Row2View addGestureRecognizer:cursorMode]; 

- (void)longPress:(UILongPressGestureRecognizer *)gr { 
    CGPoint location = [gr locationInView:gr.view]; 
    // you can compute the change in location like this 
    CGPoint delta = CGPointMake(location.x-self.lastLocation.x, location.y-self.lastLocation.y); 

    // do whatever you want with location or delta, then at the end... 
    self.lastLocation = location; 
} 

Пожалуйста, обратите внимание, что выбор системы координат является результатом того, какой вид мы переходим к locationInView:. Пропустив gr.view в качестве предлагаемого кода, мы будем отслеживать панорамирование в пределах вид, который получает жест. Другим общим выбором координат является отслеживание панорамы в режиме просмотра.

+0

Мое намерение запускать UIPanGestureRecognizer после UILongPress, как я могу его достичь, если мой * cursorMode будет UIPanGestureRec? – Edgar

+0

Что я ожидал от своего кода: 1) Получать LongPress 2) Триггеры LongPress UIPanGestureRecognizer и 3) UIpanGestureRecognaizer теперь приемник, но не UILongPress. – Edgar

+0

@ Edgar - см. Править. это возможно всего за один грамм. Вы могли бы попытаться сделать две работы, но это сложнее. – danh

0

-(CGPoint)velocityInView:(UIView *)view представляет собой метод UIPanGestureRecognizer, но не UILongPressGestureRecognizer или UIGestureRecognizer, поэтому ваше приложение рушится.

+0

Да, я знаю, но как я могу отправить 'speedInview' в' UIPanGestureRec'? – Edgar

Смежные вопросы