iOS UIActionSheet, представленный жестом LongPress на кнопке, по ошибке требует двойного нажатия кнопок - PullRequest
4 голосов
/ 26 октября 2011

У меня есть приложение с вкладками, на одной из вкладок у меня есть MKMapView.В этом представлении my viewDidLoad я инициализирую распознаватель жестов длинным нажатием для кнопки UIB.Когда эта кнопка нажата и помогает, она представляет 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];
}

1 Ответ

7 голосов
/ 28 октября 2011

Анна Каренина была права, и предоставленная ссылка помогла мне разобраться. По сути, 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];
    } 
}
...