UIGestureRecognizer окончание - PullRequest
12 голосов
/ 10 февраля 2011

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

Я создаю и добавляю распознаватель к своему виду.

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 радиан.

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

Ответы [ 3 ]

25 голосов
/ 12 февраля 2011

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

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

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

1 голос
/ 10 февраля 2011

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

0 голосов
/ 30 октября 2017

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

if (gesture.state == .recognized || gesture.state == .changed) {
}
else if (gesture.state == .ended) {
//do something else
//=> never called
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...