23

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

谢谢阅读。

PD:就像在这个线程中评论的那样,我不喜欢使用任何模态解决方案。

编辑:

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

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

11 回答 11

113

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

[[UIApplication sharedApplication] beginIgnoringInteractionEvents];

[[UIApplication sharedApplication] endIgnoringInteractionEvents];
于 2013-05-17T12:41:34.873 回答
7

在 Swift 3.0 中禁用交互:-

UIApplication.shared.beginIgnoringInteractionEvents()

恢复互动:-

UIApplication.shared.endIgnoringInteractionEvents()
于 2017-01-31T10:12:41.293 回答
4

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

[[UIApplication sharedApplication] beginIgnoringInteractionEvents];

在视图中启用触摸事件

[[UIApplication sharedApplication] endIgnoringInteractionEvents];
于 2013-08-30T10:16:12.647 回答
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];

}

}
于 2011-04-05T12:01:48.247 回答
3

只需添加

[self.view setUserInteractionEnabled:NO];  

之前

[self.activityIndicator startAnimating];  

并在之后重新启用它

[self.activityIndicator stopAnimating];
[self.view setUserInteractionEnabled:YES]; 
于 2012-11-06T13:44:34.827 回答
1

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

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

此示例假定当您隐藏UIActivityIndicatorView您调用以下之一时:

[spinner removeFromSuperview];

或者

[spinner stopAnimating];
于 2011-04-05T13:43:15.387 回答
1

使用 SVProgressHUD WrapperClass 它有很多选项来显示 ActivityIndi​​cator
源代码点击这里!

[SVProgressHUD showWithMaskType:SVProgressHUDMaskTypeBlack];


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

[SVProgressHUD 关闭]

启用背景触摸。

于 2014-02-28T07:37:45.130 回答
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 来确定何时运行你的东西

于 2016-07-24T20:54:20.790 回答
1

对于 swift 5,您可以使用:

self.view.isUserInteractionEnabled = false

并再次启用所有功能:

self.view.isUserInteractionEnabled = true

如果你有一些滞后问题,比如冻结大约几秒钟,只需将其放入:

DispatchQueue.main.async{}

于 2021-04-19T12:28:29.387 回答
0

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

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

于 2011-04-05T12:04:58.620 回答
0

虽然在较早的回复中回复了答案,但就像出于信息目的添加“[self.activityIndi​​catorView setHidden:YES];” 无需显式调用此方法,因为 startAnimating/stopAnimating 已经处理了这一点。我假设您使用的是“hidesWhenStopped”属性的默认值。

于 2015-10-07T10:41:22.500 回答