iOS UIActionSheet, представленный жестом LongPress на кнопке, ошибочно требует двойного щелчка по кнопкам для закрытия

У меня есть приложение с вкладками, на одной из вкладок у меня есть MKMapView. В этом представлении мой viewDidLoad я инициализирую распознаватель жестов длительного нажатия для UIButton. Когда эта кнопка нажата и справка представляет UIActionSheet с 5 кнопками + кнопка отмены. Каждая кнопка представляет уровень масштабирования: «Мир», «Страна», «Штат», «Город», «Текущее местоположение». Выбор кнопки в UIActionSheet увеличивает базовый MKMapView до этого уровня.

Проблема, с которой я сталкиваюсь, заключается в том, что все кнопки (включая кнопку отмены) требуют двойного нажатия, чтобы закрыть UIActionSheet. Это не предполагаемое поведение — оно должно закрываться после однократного нажатия кнопки, как и любой другой UIActionSheet. После первого нажатия я вижу, как карта масштабируется до соответствующего уровня за UIActionSheet, поэтому я знаю, что прикосновение регистрируется на правильной кнопке, но кнопка не выделяется синим цветом при первом нажатии, и UIActionSheet не закрывается. Пока я не нажму кнопку во второй раз, она подсветится синим цветом, а затем исчезнет.

Если я удалю распознаватель жестов длительного нажатия и представлю UIActionSheet для «подкраски внутри», тогда все будет работать так, как должно. Итак, я знаю, что жест как-то мешает, есть идеи по исправлению или обходному пути? Или это ошибка, о которой следует сообщить в Apple?

- (void) viewDidLoad {
    // intitialize longpress gesture
    UILongPressGestureRecognizer *longPressRecognizer = [[UILongPressGestureRecognizer alloc]
                                                         initWithTarget:self 
                                                         action:@selector(zoomOptions:)];
    longPressRecognizer.minimumPressDuration = 0.5;
    longPressRecognizer.numberOfTouchesRequired = 1;
    [self.currentLocationButton addGestureRecognizer:longPressRecognizer];
}

- (IBAction) zoomOptions:(UIGestureRecognizer *)sender {
    NSString *title = @"Zoom to:";
    UIActionSheet *zoomOptionsSheet = [[UIActionSheet alloc] initWithTitle:title delegate:self cancelButtonTitle:@"Cancel" destructiveButtonTitle:nil otherButtonTitles:@"World", @"Country", @"State", @"City", @"Current Location", nil];  

    [zoomOptionsSheet showFromTabBar:appDelegate.tabbarController.tabBar];
}

person jmcopeland    schedule 26.10.2011    source источник
comment
Это не ошибка. См. этот вопрос.   -  person    schedule 26.10.2011


Ответы (1)


Анна Каренина была права, и помогла мне разобраться. По сути, UILongPressGestureRecognizer — это «непрерывный жест», который претерпевает различные изменения состояния. Мне нужно было проверить соответствующее состояние, в моем случае это UIGestureRecognizerStateBegan, так как я хочу, чтобы UIActionSheet отображалось после удержания кнопки нажатой, но до того, как вы отпустите и остановите жест. Все, что мне нужно было сделать, это обернуть представление UIActionSheet в оператор if, который проверяет соответствующее состояние. Теперь он работает так, как ожидалось.

- (IBAction) zoomOptions:(UILongPressGestureRecognizer *)sender {
    if (sender.state == UIGestureRecognizerStateBegan) {
        NSString *title = @"Zoom to:";
        UIActionSheet *zoomOptionsSheet = [[UIActionSheet alloc] 
                                            initWithTitle:title 
                                                 delegate:self 
                                        cancelButtonTitle:@"Cancel"
                                   destructiveButtonTitle:nil 
                                        otherButtonTitles:@"World", @"Country",                
                                                          @"State", @"City", 
                                                          @"Current Location", nil];  
        [zoomOptionsSheet showFromTabBar:appDelegate.tabbarController.tabBar];
    } 
}
person jmcopeland    schedule 27.10.2011