2011-02-09 3 views
12

Я хотел бы обработать поворотный жест в моем приложении iPhone и повернуть изображение в это время. В конце жеста я хотел бы повернуть в фиксированное положение imageView. Итак, т.е. если я поворачиваю изображениеView от 0 радиан до M_PI/2 радианов, но где-то на полпути я заканчиваю жестом. После того, как в конце я хотел бы проверить угол и если он близок к M_PI/2, то установите его в M_PI/2 в противном случае 0.
Вот мой код, как я пытался сделать это:UIGestureRecognizer завершено

создать и добавить на мой взгляд.

UIGestureRecognizer *recognizer = [[UIRotationGestureRecognizer alloc] initWithTarget:self action:@selector(gestureRecognized:)]; 
recognizer.delegate = self; 
[self addGestureRecognizer:recognizer]; 
[recognizer release]; 

методы делегата:

- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch { 
    if (_imageView) { 
     return YES; 
    } 
    return NO; 
} 

- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer { 
    return YES; 
} 

Жест признан метод:

- (void)gestureRecognized:(UIRotationGestureRecognizer *)recognizer { 
    _imageView.transform = CGAffineTransformMakeRotation(recognizer.rotation); 
} 

Эти методы работают, но вот способ, как я пытался получить в конце жеста. Это не работает:

- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event { 
    NSLog(@"gesture end"); 
} 

Также с преобразованием у меня есть небольшая проблема. Иногда он возвращается к радиусу 0.

Любое предложение приветствуется. Благодаря!

ответ

25

Я нашел ответ на другом форуме. Надеюсь, это поможет и кому-то другому. Ответ:

Вы можете обнаружить конец жеста, проверяя состояние UIRotationGestureRecognizer в вашем методе действия. Если [gestureRecognizer state] == UIGestureRecognizerStateEnded, то это сделано. Если что-то вместо этого заставило его отменить (например, звонок по телефону), вы увидите, что он закончится в UIGestureRecognizerStateCancelled.

Если вы хотите применить поворот распознавателя непосредственно к вашему представлению, а не относиться к нему как к дельтам из предыдущего местоположения, вы можете установить поворот распознавателя, его состояние - UIGestureRecognizerStateBegan, а затем оно рассчитает смещения от этого значения, а вы могут применять их напрямую. Это просто требует, чтобы вы помнили поворот, который вы в последний раз закончили, а затем вы можете сделать что-то вроде [gestureRecognizer setRotation: lastAppliedRotation], когда состояние распознавателя - UIGestureRecognizerStateBegan.

1

Если gestureRecognizer распознает жест, по умолчанию touchesEnded не будет называться (touchesCancelled будет называться вместо. touchesEnded будет вызываться только если распознаватель не распознает жест). Установите gestureRecognizer.delaysTouchesEnded на номер NO, и он должен работать.

+0

Не работает. Ты знаешь почему? Все еще не получаю конца. –

+0

Итак, метод вызывается сейчас, но не тогда, когда я отпускаю свои пальцы, он вызывается после начала поворота –

+0

Так что он не вызывается в конце. Любые подсказки? –

0

Только в случае, если это произойдет с вами, как хорошо, и это причина, вы читаете этот вопрос: «закончился» и «признали» имеют одинаковое значение (3). Таким образом, этот код (в быстром) не будет работать:

if (gesture.state == .recognized || gesture.state == .changed) { 
} 
else if (gesture.state == .ended) { 
//do something else 
//=> never called 
} 
Смежные вопросы