0

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

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

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

4

3 回答 3

3

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

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

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

于 2012-07-16T04:35:59.200 回答
-1

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

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

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

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

于 2012-07-16T05:02:02.997 回答
-1

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

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

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

于 2017-07-27T18:17:45.940 回答