假设我有两个视图控制器:xVC和yVC。我使用了shake API,并在xVC中使用了-(void)motionBegan
,-(void)motionEnded:
和-(void)motionCancelled
方法。发生的事情是当设备被震动时,它会触发一个简单的动画。现在的问题是,即使我已经打开了yVC,即当yVS.view
被添加为子视图时,也会触发此动画。我正在寻找的是一些if条件,我可以在-(void)motionEnded:
中使用这样的条件:
if(yVC == nil)
{
//trigger animation
}
我的意思是当yVC可见时摇动不起作用。我怎么做?请帮忙。
答案 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
将是非零的。