UILongPressGesture минимумPressDuration

Итак, я относительно новичок в Objective-C, и есть определенная вероятность того, что я упускаю что-то довольно очевидное, так что не стесняйтесь бросать в меня помидоры, если это так. Вот моя проблема:

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

- (void)viewWillAppear:(BOOL)animated {
    UILongPressGestureRecognizer * longPressRecognizer = [[UILongPressGestureRecognizer alloc] initWithTarget:self action:@selector(handleLongPress:)];
    [mapView addGestureRecognizer:longPressRecognizer];  // Actual map view handler is added to

    ...

}

-(void) handleLongPress:(UILongPressGestureRecognizer *)gestureRecognizer {
    NSLog (@"Did it work?!");
    // Some code here to make pins appear; omitted for simplicity in this question
}

Как и ожидалось, когда я долго нажимаю на карту, через 0.5 секунд (время по умолчанию) у меня будет 1 булавка на карте. Если я двигаюсь вокруг пальца, у меня куча булавок. Журнал также распечатывает "Это сработало?!" много раз снова и снова. Опять ожидаемо. Однако, когда я добавляю одну строчку в метод viewWillappear (прямо перед отправкой сообщения addGestureRecognizer в mapView):

longPressRecognizer.minimumPressDuration = 1.0;

...жест больше не работает. В том, что я держу пресс в течение 1 секунды, и в журнале ничего не появляется. Отпусти, попробуй дольше одной секунды... ничего. Никакие булавки не сбрасываются, и ничего не распечатывается в журнале. Почему это происходит? Я не могу понять, почему установка минимальной продолжительности может нарушить это. Я ожидаю, что это должно работать так же, как и раньше — без настраиваемой минимальной продолжительности нажатия — с той лишь разницей, что мне нужно удерживать 1 полную секунду вместо половины одной.

Обновление: похоже, что если я выберу значения между 0.1 и 0.5 включительно, это сработает. Но как только я перехожу к 0.6 или больше, это не работает. Что-то происходит под капотом в Obj-C, о чем я не знаю?

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

Спасибо!

PS, используя OS X 10.8.2 и Xcode 4.5.1 (4G1004).


person Stefan Arambasich    schedule 05.10.2012    source источник
comment
Установка для параметра MinimumPressDuration любого значения (в том числе больше 0,6) работает в моем тесте (в iOS 5 и 6). Проверка состояния (которую вам нужно сделать) не решит описанную вами проблему, поскольку метод обработчика распознавателя (где вы проверяете состояние) даже не вызывается.   -  person    schedule 05.10.2012


Ответы (1)


Я столкнулся с той же проблемой. После установки делегата распознавателя и включения одновременного распознавания эта проблема решена. Ниже приведен мой код для справки:

- (void)init
{
    UILongPressGestureRecognizer *longPressGestureRecognizer = [[UILongPressGestureRecognizer alloc] initWithTarget:self action:@selector(lockLongPress:)];
    longPressGestureRecognizer.minimumPressDuration = 1.0;
    longPressGestureRecognizer.delegate = self; 
    [targetView addGestureRecognizer:longPressGestureRecognizer];
}

- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer
{
    return YES;
}
person ananfang    schedule 06.04.2013