2011-04-05 93 views
18

我有一个包含两个视图的视图。其中一个视图包含两个按钮和一些文本标签。另一个,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

这适用于我 http:// stackoverflow。com/questions/5404856/how-to-disable-touch-input-to-all-views-except-the-top-most-view – 2012-10-18 15:12:45

回答

102

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

[[UIApplication sharedApplication] beginIgnoringInteractionEvents]; 

[[UIApplication sharedApplication] endIgnoringInteractionEvents]; 
+0

好的解决方案。谢谢。 – Autobots 2013-05-27 04:05:39

+0

这只是完美的,它也不会关闭键盘,如果它是可见的。 – Eugene 2014-03-09 17:07:11

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

} 

} 
+0

检查我的问题,我正在做什么,它不能正常工作。哪里有问题? – 2011-04-06 12:08:11

+1

首先[menubutton setEnabled:NO]将禁用该按钮,因此您也不需要在其上调用userInteraction。其次,如果您在整个视图中diable userInteraction,则不需要将其设置为单个按钮,所有内容都将被禁用。考虑到这两点,你应该能够从你的方法中删除很多代码。 – DavidM 2011-04-06 13:12:44

+0

我拥有所有这些代码,因为我尝试了几种方法来获得我想要的。我知道,如果我禁用用户交互到主视图控制器中,我不需要禁用按钮或其他视图。但即使禁用用户交互进入主视图控制器(使用Interface Builder),当UIActivityIndi​​catorView停止时,仍然允许用户交互进入主视图控制器,应用程序记住用户操作并对其作出响应。 – 2011-04-06 14:52:16

0

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

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

+0

如何知道应用程序是否忙? – 2011-04-05 14:43:51

+0

“忙”是指您决定展示活动指标的时间段。你决定。例如,如果您正在上传文件,那么在上传完成之前(假设您想在此情况下锁定用户界面),您的应用程序将处于“忙碌”状态。 – djromero 2011-04-05 17:36:36

+0

我用一段代码编辑了我的问题。在那里我像你说的那样做,但它不适用。哪里有问题? – 2011-04-06 11:58:05

0

您可以基于显示或不显示UIActivityIndicatorView来禁用/启用UIButton。或者,如果你只是想“放弃用户交互”,而显示的微调,在按键处理方法:

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

这个例子假设当你隐藏UIActivityIndicatorView你调用一个:

[spinner removeFromSuperview]; 

[spinner stopAnimating]; 
3

只需添加

[self.view setUserInteractionEnabled:NO]; 

[self.activityIndicator startAnimating]; 

,并重新启用后

[self.activityIndicator stopAnimating]; 
[self.view setUserInteractionEnabled:YES]; 
+0

这并没有阻止用户点击后退按钮“”推回 – coolcool1994 2013-05-13 16:53:08

4

在视图中禁用触摸事件,

[[UIApplication sharedApplication] beginIgnoringInteractionEvents]; 

要启用触摸事件视图

[[UIApplication sharedApplication] endIgnoringInteractionEvents]; 
1

使用SVProgressHUD WrapperClass它有这么多的选项,以显示ActivityIndi​​cator
源代码Click Here !

[SVProgressHUD showWithMaskType:SVProgressHUDMaskTypeBlack]。


使用上面的语句来禁用背景触摸

[SVProgressHUD驳回]

为了使背景触摸。

0

尽管答案在前面的回复中回复,就像添加信息目的一样“[self.activityIndi​​catorView setHidden:YES];”不需要明确调用此方法,因为startAnimating/stopAnimating已经处理此问题。我假设你正在使用“hidesWhenStopped”属性的默认值。

+0

这种回答是评论 – bofredo 2015-10-07 11:00:47

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来确定何时运行你的东西

3

在雨燕3.0 禁用互动: -

UIApplication.shared.beginIgnoringInteractionEvents() 

要恢复的互动: -

UIApplication.shared.endIgnoringInteractionEvents() 
+0

如果使用的功能,这是很好的补充检查,像 '如果UIApplication.shared.isIgnoringInteractionEvents { UIApplication.shared.endIgnoringInteractionEvents() }' 因为它似乎是堆砌“开始“,因此您应该添加尽可能多的”结束“以避免应用程序被锁定 – Efren 2017-07-13 07:20:19

相关问题