Как использовать два действия в UIPanGestureRecognizer?

Я работаю с двумя подвидами. Каждая будет уникальна и будет иметь свое «действие».

Подвид 1 = Пользователь может перетаскивать вид, вращать и масштабировать его.

Подвид 2 = когда пользователь перемещает палец по экрану, изображение добавляется в каждую точку, к которой прикасается его палец.

Я выполнил оба этих действия с помощью UIPanGestureRecognizer. Мой вопрос в том, как я могу разделить эти два действия? Я хочу иметь возможность добавить одно подпредставление, сделать то, что требуется, а затем, когда я добавлю другое подпредставление, предотвратить выполнение предыдущих действий.

Вот что я пробовал, это делается в моем методе panGesture:

 for (UIView * subview in imageView.subviews)
 {
    if ([subview isKindOfClass:[UIImageView class]])
    {
        if (subview == _aImageView)
        {
            CGPoint translation = [panRecognizer translationInView:self.view];
            CGPoint imageViewPosition = _aImageView.center;
            imageViewPosition.x += translation.x;
            imageViewPosition.y += translation.y;

            _aImageView.center = imageViewPosition;
            [panRecognizer setTranslation:CGPointZero inView:self.view];
        }
        else if (subview == _bImageView)
        {
            currentTouch = [panRecognizer locationInView:self.view];

            CGFloat distance = [self distanceFromPoint:currentTouch ToPoint:prev_touchPoint];
            accumulatedDistance += distance;
            CGFloat fixedDistance = 60;

            if ([self distanceFromPoint:currentTouch ToPoint:prev_touchPoint] > fixedDistance)
            {
                [self addbImage];

                prev_touchPoint = currentTouch;
            }
        }
    }
}

person Luke Irvin    schedule 19.11.2012    source источник


Ответы (2)


Если вы хотите различать распознавание жестов в двух разных представлениях, поместите отдельные распознаватели в каждое представление.

person rickster    schedule 19.11.2012
comment
Ok. Я это сделал, но как мне разрешить вызывать только один жест? Поэтому, если я сначала добавлю aImageView в качестве подпредставления, а затем добавлю bImageView в качестве подпредставления, aImageView все равно будет добавлен, и его жест активен. - person Luke Irvin; 19.11.2012

Обычно вы хотите, чтобы ваш контроллер представления владел и управлял распознавателями жестов, например.

- (void)viewDidLoad {
    self.panGesture = [[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(handleGesture:)];
    self.panGesture.delegate = self;
    [self.viewX addGestureRecognizer:self.panGesture];
    // repeat with other recognisers...
}

Обратите внимание, что установка вашего контроллера в качестве делегата дляgestRecognizer важна: это позволяет вам обрабатывать следующий метод делегата из контроллера представления (который был основным вопросом):

- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer
{
    // handle your logic, which gestureRecognizer should proceed...
    return NO;
}

Метод обработчика тот же, что и в этом примере, но вы можете настроить свои собственные обработчики по своему усмотрению:

- (void)handleGesture:(UIGestureRecognizer*)gestureRecognizer {
     // handle gesture (usually sorted by state), e.g.
     // if(gesture.state == UIGestureRecognizerStateEnded) { ... }
}
person auco    schedule 24.03.2015