Разве UIRecognizer не должен срабатывать при касании подпредставления? - PullRequest
1 голос
/ 03 ноября 2011

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

Ожидается ли это?Как я могу удалить это экранирующее поведение?Каковы хорошие практики для отладки распознавателей жестов?

Более подробно:

Основной вид «холста» моего приложения позволяет пользователю добавлять формы к нему «длинным двойным касанием».Я прикрепил распознаватель жестов для таких жестов к основному виду.Это работает очень хорошо: основной вид вызывается и реагирует, добавляя фигуру к основному виду.

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

Однако, когда пользователь долго-дважды нажимает на представление формы, ничего не происходит: представление формы не вызывается, что ожидается, поскольку он не имеет распознавателя жестов для длинных двойных нажатий.Но основной вид тоже не называется.Я думал, что, поскольку жест не распознается представлением формы, он будет распространяться в цепочке респондента до основного представления.Но этого не происходит.

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

Что я мог пропустить?

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

Но это звучит расточительно, и что более важно, я хотел бы понять поведение.

Спасибо за любые предложения.

1 Ответ

1 голос
/ 03 ноября 2011

Насколько я вижу, оно должно передавать сообщение из коробки.

Чтобы оба gestureRecognizers не были запущены, вам нужно сделать что-то вроде:

[longPress requireGestureRecognizerToFail:doubleLongPress];

Обновление

Просто бесплатная стилизация здесь, но если вы хотите ограничить жест одним представлением, вы можете попробовать поиграть с делегатом жеста (ответ будет только в том случае, если касаемое представление self.view)

self.myGesture.delegate = self;

В вашем контроллере сделайте что-то вроде:

//.h
@interface MyController : UIViewController <UIGestureRecognizerDelegate>
// ...
@end

//.m
@implementation MyController

//...

- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch;
{
    BOOL shouldReceiveTouch = YES;

    if (gestureRecognizer == self.myGesture) {
        shouldReceiveTouch = (touch.view == self.view);
    }

    return shouldReceiveTouch;
}

//...

@end

NB Я не проверял это, но я обновлю его, когда опробую позже.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...