我如何知道视图是不是可见?

Posted

技术标签:

【中文标题】我如何知道视图是不是可见?【英文标题】:How do I know if a view is visible or not?我如何知道视图是否可见? 【发布时间】:2012-07-16 04:32:02 【问题描述】:

假设我有两个视图控制器:xVC 和 yVC。我使用了shake API,并在xVC中使用了-(void)motionBegan-(void)motionEnded:-(void)motionCancelled方法。发生的情况是当设备摇晃时,它会触发一个简单的动画。现在的问题是,即使我打开了 yVC,即当 yVS.view 已添加为子视图时,也会触发此动画。我正在寻找的是一些我可以在-(void)motionEnded: 中使用的 if 条件,如下所示:

if(yVC == nil)

     //trigger animation
 

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

【问题讨论】:

【参考方案1】:

我看到并使用过的一般建议是询问视图是否具有非零window 属性:

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

但请注意,这并不总是等同于可见;尽管在大多数应用程序中,它的性能几乎与您所能获得的一样好(它不准确的基本情况是当不同的视图完全掩盖它时,但这仍然可以满足您的需求)

【讨论】:

【参考方案2】:

将此添加到您的两个视图控制器中:

-(void)viewDidAppear:(BOOL)animated 

  [super viewDidAppear:animated];    
  visible = YES;    


-(void)viewDidDisappear:(BOOL)animated 

  [super viewDidDisappear:animated];
  visible = NO;

现在,只需检查两个视图控制器的变量 isVisible 并同样触发您的动画。

【讨论】:

【参考方案3】:

前面的答案在某种程度上都有效,但没有考虑到模态呈现的视图控制器。如果视图控制器 A 呈现视图控制器 B,则前面的答案将告诉您 A 仍然可见。如果您像我一样想知道视图是否真正可见(而不仅仅是视图层次结构的一部分),我建议您也检查presentedViewController 属性:

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

因为presentedViewController 将在当前视图控制器其任何祖先当前正在呈现另一个视图控制器时非零。

【讨论】:

以上是关于我如何知道视图是不是可见?的主要内容,如果未能解决你的问题,请参考以下文章

检查 UIAlertView 是不是可见

如何检查视图而不是 viewController 是不是可见?

如何检查视图是不是可见(android listview)

在活动中更改列表视图的按钮可见性

如何在可见的两个视图之间切换?

如何使用 Xcode 7 UI 测试检查表格视图中的单元格是不是可见?