Не разрешать взаимодействие с пользователем, когда виден индикатор активности - PullRequest
21 голосов
/ 05 апреля 2011

У меня есть вид, который содержит два вида. Одно из этих представлений содержит две кнопки и несколько текстовых меток. Другой, с альфа-значением, равным 0,25, имеет UIActivityIndicatorView, чтобы сообщить пользователю, что приложение работает, и он должен ждать, пока оно не закончится. Если пользователь нажимает кнопку во время вращения UIActivityIndicatorView, когда UIActivityIndicatorView останавливается, приложение запоминает действие пользователя и реагирует на него. Как я могу отменить взаимодействие с пользователем, которое происходит во время вращения UIActivityIndicatorView?

Спасибо за чтение.

P.D .: Как прокомментировано в этой теме , я предпочитаю не использовать модальное решение.

РЕДАКТИРОВАНИЕ:

В настоящее время я использую этот код, и он работает неправильно.

- (void)viewDidAppear:(BOOL)animated {

  // The view appears with an UIActivityIndicatorView spinning.
  [self showResults]; // The method that takes a long time to finish.
  [self.activityIndicator stopAnimating];
  // When the showResults method ends, the view shows the buttons to the user.
  [self.activityIndicatorView setHidden:YES];
  [self.menuButton setEnabled:YES];
  [self.menuButton setUserInteractionEnabled:YES];
  [self.playButton setEnabled:YES];
  [self.playButton setUserInteractionEnabled:YES];
  [self.view setUserInteractionEnabled:YES];
  [self.interactionView setUserInteractionEnabled:YES];
}

Ответы [ 10 ]

109 голосов
/ 17 мая 2013

Я нашел эти методы очень полезными:

[[UIApplication sharedApplication] beginIgnoringInteractionEvents];

[[UIApplication sharedApplication] endIgnoringInteractionEvents];
5 голосов
/ 31 января 2017

В Swift 3.0 Чтобы отключить взаимодействие: -

UIApplication.shared.beginIgnoringInteractionEvents()

Чтобы восстановить взаимодействие: -

UIApplication.shared.endIgnoringInteractionEvents()
4 голосов
/ 30 августа 2013

Чтобы отключить сенсорное событие в виде,

[[UIApplication sharedApplication] beginIgnoringInteractionEvents];

Чтобы включить сенсорное событие в представлении

[[UIApplication sharedApplication] endIgnoringInteractionEvents];
4 голосов
/ 05 апреля 2011
[_button setUserInteractionEnabled:NO];

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

BOOL i_am_ready_to_submit = NO;

-(void)action_finished{

[self.activityIndicator stopAnimating];

i_am_ready_to_submit = YES;

}

-(IBAction)submit_button{

if(i_am_ready_to_submit){

[self submit];

}

}
3 голосов
/ 06 ноября 2012

просто добавьте

[self.view setUserInteractionEnabled:NO];  

перед

[self.activityIndicator startAnimating];  

и включите его снова после

[self.activityIndicator stopAnimating];
[self.view setUserInteractionEnabled:YES]; 
1 голос
/ 24 июля 2016
@IBAction func yourButtonPressed(sender: UIButton) {
if self.activityIndicator.isAnimating() {
//remember the action user asked of you using the sender
} else {
//do your stuff
return
}
yourButtonPressed(yourButton)
}

или вы используете код self.activityIndicator.animationDidStop, чтобы определить, когда запускать ваши вещи

1 голос
/ 28 февраля 2014

Использовать SVProgressHUD WrapperClass У него так много вариантов отображения ActivityIndicator
Для исходного кода Нажмите здесь!

[SVProgressHUD showWithMaskType: SVProgressHUDMaskTypeBlack];


используйте приведенную выше инструкцию для отключения фоновых касаний

[SVProgressHUD dismiss]

Включение фоновых касаний.

1 голос
/ 05 апреля 2011

Вы можете отключить / включить UIB-кнопки, основываясь на показанном UIActivityIndicatorView или нет. Или, если вы просто хотите «отменить взаимодействие с пользователем» во время отображения счетчика, в методе обработчика кнопок:

- (void)buttonTapped:(id)sender {
    if ([spinner superview] != nil && [spinner isAnimating]) {
        return;
    }
    // ... the rest of your code
}

В этом примере предполагается, что когда вы скрываете UIActivityIndicatorView, вы вызываете одно из:

[spinner removeFromSuperview];

или

[spinner stopAnimating];
0 голосов
/ 07 октября 2015

Несмотря на то, что ответ получен в предыдущем ответе, все равно, что добавить для информационных целей "[self.activityIndicatorView setHidden: YES];" нет необходимости вызывать этот метод явно, потому что startAnimating / stopAnimating уже позаботится об этом. Я предполагаю, что вы используете значение по умолчанию свойства "hidesWhenStopped".

0 голосов
/ 05 апреля 2011

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

Лучшее решение, поскольку вы не можете скрыть весь экран во всех ситуациях, - это управлять состоянием приложения (игнорировать действия, когда приложение "занято"') и отключите / включите соответствующие кнопки и другие элементы управления в зависимости от состояния каждого приложения.

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