当活动指示器视图可见时,不允许用户交互

时间:2011-04-05 11:58:52

标签: objective-c ios uiactivityindicatorview user-interaction

我有一个包含两个视图的视图。其中一个视图包含两个按钮和一些文本标签。另一个,alpha设置为0.25,有UIActivityIndicatorView告诉用户应用程序正在运行,他必须等到它完成。如果用户在UIActivityIndicatorView正在旋转时触摸按钮,则当UIActivityIndicatorView停止时,应用会记住用户操作并对其做出响应。如何丢弃UIActivityIndicatorView正在旋转时发生的用户交互?

感谢阅读。

P.D。:在this thread中评论过,我更喜欢不使用任何模态解决方案。

编辑:

我目前正在使用此代码,但它无法正常工作。

- (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];
}

11 个答案:

答案 0 :(得分:109)

我发现这些方法非常有用:

[[UIApplication sharedApplication] beginIgnoringInteractionEvents];

[[UIApplication sharedApplication] endIgnoringInteractionEvents];

答案 1 :(得分:4)

[_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];

}

}

答案 2 :(得分:4)

要在视图中禁用触摸事件,

[[UIApplication sharedApplication] beginIgnoringInteractionEvents];

在视图中启用触摸事件

[[UIApplication sharedApplication] endIgnoringInteractionEvents];

答案 3 :(得分:4)

在Swift 3.0中 要禁用互动: -

UIApplication.shared.beginIgnoringInteractionEvents()

恢复互动: -

UIApplication.shared.endIgnoringInteractionEvents()

答案 4 :(得分:3)

只需添加

[self.view setUserInteractionEnabled:NO];  

之前的

[self.activityIndicator startAnimating];  

并在

之后启用它
[self.activityIndicator stopAnimating];
[self.view setUserInteractionEnabled:YES]; 

答案 5 :(得分:1)

您可以根据所显示的UIActivityIndicatorView禁用/启用UIButtons。或者,如果您只想在显示微调器时“放弃用户交互”,则在按钮处理程序方法中:

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

此示例假设您隐藏UIActivityIndicatorView时调用以下其中一个:

[spinner removeFromSuperview];

[spinner stopAnimating];

答案 6 :(得分:1)

使用SVProgressHUD WrapperClass它有很多选项来显示ActivityIndi​​cator
源代码Click Here !

  

[SVProgressHUD showWithMaskType:SVProgressHUDMaskTypeBlack];

使用上述语句禁用背景触摸

  

[SVProgressHUD解雇]

启用背景触摸。

答案 7 :(得分:1)

@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.activityIndi​​cator.animationDidStop确定何时运行你的东西

答案 8 :(得分:1)

对于 swift 5,您可以使用:

self.view.isUserInteractionEnabled = false

并再次启用所有功能:

self.view.isUserInteractionEnabled = true

如果您遇到一些延迟问题,例如冻结大约几秒钟,只需将其输入:

DispatchQueue.main.async{}

答案 9 :(得分:0)

快速解决方案:添加覆盖整个屏幕的透明或伪透明视图。在此视图的顶部添加活动指示器。等待期结束后,删除两个视图。 Get some inspiration

更好的解决方案,因为您无法在所有情况下隐藏整个屏幕,是管理应用程序的状态(忽略应用程序“忙碌”时的操作)并禁用/启用相应的按钮和其他控件依赖在每个应用程序状态。

答案 10 :(得分:0)

虽然在早期的回复中回答了答案,但为了增加信息目的“[self.activityIndi​​catorView setHidden:YES];”无需显式调用此方法,因为startAnimating / stopAnimating已经解决了这个问题。我假设您使用的是“hidesWhenStopped”属性的默认值。