Как заставить uiactionsheet отклонить, когда вы нажимаете снаружи, например, над ним? - PullRequest
12 голосов
/ 30 мая 2011

Как мне отменить отображение uiactionsheet, когда вы нажимаете снаружи, например, над ним? Это для iPhone. Видимо ipad делает это по умолчанию (я могу ошибаться).

Ответы [ 10 ]

15 голосов
/ 30 мая 2011

Хорошо, есть решение. Следующее относится к подклассу UIActionSheet

// For detecting taps outside of the alert view
-(void)tapOut:(UIGestureRecognizer *)gestureRecognizer {
    CGPoint p = [gestureRecognizer locationInView:self];
    if (p.y < 0) { // They tapped outside
        [self dismissWithClickedButtonIndex:0 animated:YES];
    }
}

-(void) showFromTabBar:(UITabBar *)view {
    [super showFromTabBar:view];

    // Capture taps outside the bounds of this alert view
    UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(tapOut:)];
    tap.cancelsTouchesInView = NO; // So that legit taps on the table bubble up to the tableview
    [self.superview addGestureRecognizer:tap];
    [tap release];
}

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

4 голосов
/ 30 мая 2011

это может быть полезно для вас Использование:

- (void)dismissWithClickedButtonIndex:(NSInteger)buttonIndex animated:(BOOL)animated

предыдущий, так что вопрос

3 голосов
/ 30 мая 2011

Я думаю, что вы ищете этот метод

- (void)dismissWithClickedButtonIndex:(NSInteger)buttonIndex animated:(BOOL)animated

РЕДАКТИРОВАТЬ

вы можете использовать его на объекте листа действий, и он работает просто отлично, но вы не можетезарегистрировать событие за пределами этого листа, как часть, выделенная серым цветом

, может быть, если вы используете UITapGestureRecognizer на вашем контроллере представления, чем это может сработать.

UITapGestureRecognizer *recognizer = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(nothing)];
[actionSheet addGestureRecognizer:recognizer];
1 голос
/ 12 апреля 2017

Нет необходимости какого-либо жеста крана. Просто используйте действие UIAlertActionStyleCancel.

1 голос
/ 26 апреля 2016

После установки для свойства cancelButtonIndex UIActionSheet действительного значения при нажатии вне будет отменен UIActionSheet.Я пытался в iOS 9. Однако, если для cancelButtonIndex не задано неправильное значение (например, индекс, превышающий общее количество кнопок в UIActionSheet), при нажатии снаружи ничего не произойдет.

0 голосов
/ 07 июля 2017

Используйте .cancel UIAlertActionStyle в качестве опции.

0 голосов
/ 04 августа 2014

в iOS7 я добавляю dismissWithClickedButtonIndex msg в gestureRecognizerShouldBegin, и это работает.

0 голосов
/ 15 июля 2014

Используйте showFromRect, например:

UIView *barButtonView = [barButtonItem valueForKey:@"view"];
CGRect buttonRect = barButtonView.frame;

[actionSheet showFromRect:buttonRect inView:self.view animated:YES];
0 голосов
/ 29 ноября 2012

Это не дает точного ответа на вопрос, но вот что я делаю, чтобы закрыть средство выбора при нажатии на один из его элементов (это предотвращает добавление дополнительной кнопки «Готово» или «Внешний щелчок»):

Реализуйте метод делегирования viewForRow, в котором вы создаете UILabel и возвращаете его:

- (UIView *)pickerView:(UIPickerView *)pickerView viewForRow:(NSInteger)row forComponent:(NSInteger)component reusingView:(UIView *)view

В эти пользовательские метки строк добавьте обработчик действия нажатия:

UITapGestureRecognizer *tapAction = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(handleClick:)];
[label addGestureRecognizer:tapAction];

В обратном вызове handleClick отклоните открытый лист (тот, который содержит представление средства выбора):

[pickerSheet dismissWithClickedButtonIndex:0 animated:TRUE];
0 голосов
/ 30 мая 2011

Вы не можете сделать это, нажав снаружи, потому что лист действия покрывает весь вид некоторый прозрачный черный вид с кнопками в виде листа в iphone, но в ipad это поведение присутствует по умолчанию.

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

...