如何知道视图是否可见?

说我有两个视图控制器:xVC和yVC。 我已经使用了-(void)motionBegan API,并使用了方法-(void)motionBegan-(void)motionEnded:-(void)motionCancelled在xVC中取消。 发生什么事是当设备被震动,它发射一个简单的animation。 现在的事情是,即使当我有yVC打开,即当yVS.view已被添加为子视图,这个animation被解雇。 我正在寻找的是一些如果我可以使用的条件-(void)motionEnded:像这样:

 if(yVC == nil) { //trigger animation } 

我的意思是,当yVC可见时,震动不应该起作用。 我怎么做? 请帮忙。

我所看到和使用的一般build议是询问一个视图是否有非零window属性:

 if( ! yVC.view.window) { // trigger animation } 

但请注意,这并不总是等同于可见; 尽pipe在大多数应用程序中,它大致和你能够获得的一样好(基本的情况下,不准确的是当不同的视图完全遮掩它,但是这仍然可以满足你的需要)

添加到你的两个视图控制器:

 -(void)viewDidAppear:(BOOL)animated { [super viewDidAppear:animated]; visible = YES; } -(void)viewDidDisappear:(BOOL)animated { [super viewDidDisappear:animated]; visible = NO; } 

现在,只需检查两个视图控制器的variablesisVisible并同样触发你的animation。

以前的答案都在一定程度上起作用,但是没有考虑模态expression的视图控制器。 如果视图控制器A呈现视图控制器B,以前的答案会告诉你A仍然可见。 如果你像我一样,想知道视图是否真的可见(而不仅仅是视图层次结构的一部分),我还build议检查presentedViewController属性:

 if (self.isViewLoaded && [self.view window] && !self.presentedViewController) { // User is looking at this view and nothing else } 

这是可行的,因为无论何时当前视图控制器或其任何祖先正在呈现另一个视图控制器时,呈现视图控制器都将是非零的。