Перенос переноса переносов, представляющий собой reset между begin-begin и обработчиком (с началом состояния) на iOS7

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

Однако на iOS7 перевод иногда получает reset между gestureRecognizerShouldBegin: и моим обработчиком жестов handlePan:

- (BOOL)gestureRecognizerShouldBegin:(UIPanGestureRecognizer*)panGR
{
    CGPoint trans = [panGR translationInView:self.view];
    NSLog(@"should begin trans: (%.2f, %.2f)", trans.x, trans.y);
    ...

Эти журналы: should begin trans: (18.00, 0.00)

- (void)handlePan:(UIPanGestureRecognizer*)panGR
{
    CGPoint trans = [panGR translationInView:self.view];

    switch(panGR.state)
    {
        case UIGestureRecognizerStateBegan:
            NSLog(@"handlePan began trans: (%.2f, %.2f)", trans.x, trans.y);
            ...

Эти журналы: handlePan began trans: (0.00, 0.00)

Это означает, что общий код для определения направления панорамирования (справа в этом случае) работает в gestureRecognizerShouldBegin: и позволяет начать жест, но затем не может быть определен в handlePan:, когда state UIGestureRecognizerStateBegan.

Является ли это ошибкой в ​​iOS7 или имеет намеренное изменение поведения для размещения новых типов жестов? Кроме того, может ли кто-нибудь предложить хороший способ обойти эту проблему?

Ответы

Ответ 1

UIPanGestureRecognizer всегда устанавливает перевод на (0,0) после достижения состояния UIGestureRecognizerStateBegan - поскольку признан даже малейший перевод, который предназначен для работы только в качестве триггера (если вы установите большой порог для начала распознавание типа (50,50), вы, очевидно, получите "отставание" в поведении пользовательского интерфейса - в качестве обходного пути я бы предложил сохранить значение перевода, а затем использовать анимацию UIView для более плавной панорамирования объекта). Вы должны использовать UIGestureRecognizerStateChanged для обновления перевода и UIGestureRecognizerStateRecognized для установки конечной точки панорамирования.

Ответ 2

Вы можете определить направление в handlePan:, проверив, является ли горизонтальный перевод выше или ниже 0. Но в конце handlePan: вам нужно reset CGPoint перевода в качестве нового ссылка на следующий перевод.

- (void)handlePan:(UIPanGestureRecognizer*)panGR
{
    CGPoint translation = [gr translationInView:self.view];
    if (translation.x > 0) {
        //Direction: Right
    } else if (translation.x < 0) {
        //Direction: Left
    }


    [gr setTranslation:CGPointZero
                inView:self.view];
}