Подтвердить что ты не робот

Окончание UIGestureRecognizer

Я хотел бы обработать поворотный жест в моем приложении для iPhone и повернуть изображение в это время. В конце жеста я хотел бы повернуть в фиксированное положение imageView. Итак, т.е. если я поворачиваю изображениеView от 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 радиану.

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

4b9b3361

Ответ 1

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

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

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

Ответ 2

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

Ответ 3

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

if (gesture.state == .recognized || gesture.state == .changed) {
}
else if (gesture.state == .ended) {
//do something else
//=> never called
}