我有一个包含两个视图的视图。其中一个视图包含两个按钮和一些文本标签。另一个,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];
}
答案 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它有很多选项来显示ActivityIndicator
源代码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.activityIndicator.animationDidStop确定何时运行你的东西
答案 8 :(得分:1)
对于 swift 5,您可以使用:
self.view.isUserInteractionEnabled = false
并再次启用所有功能:
self.view.isUserInteractionEnabled = true
如果您遇到一些延迟问题,例如冻结大约几秒钟,只需将其输入:
DispatchQueue.main.async{}
答案 9 :(得分:0)
快速解决方案:添加覆盖整个屏幕的透明或伪透明视图。在此视图的顶部添加活动指示器。等待期结束后,删除两个视图。 Get some inspiration
更好的解决方案,因为您无法在所有情况下隐藏整个屏幕,是管理应用程序的状态(忽略应用程序“忙碌”时的操作)并禁用/启用相应的按钮和其他控件依赖在每个应用程序状态。
答案 10 :(得分:0)
虽然在早期的回复中回答了答案,但为了增加信息目的“[self.activityIndicatorView setHidden:YES];”无需显式调用此方法,因为startAnimating / stopAnimating已经解决了这个问题。我假设您使用的是“hidesWhenStopped”属性的默认值。