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

时间:2012-07-16 04:32:02

标签: objective-c ios xcode cocoa-touch animation

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

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

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

3 个答案:

答案 0 :(得分:2)

我见过和使用过的一般建议是询问一个视图是否有非零window属性:

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

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

答案 1 :(得分:-1)

将其添加到两个视图控制器:

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

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

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

答案 2 :(得分:-1)

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

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

这是有效的,因为只要当前视图控制器 OR 其任何祖先当前正在呈现另一个视图控制器,presentedViewController将是非零的。