我需要检测哪个视图在前面(当前可见)。我怎样才能做到这一点?
这是我想做的事情:
if ( ! <<methodToTellIfViewAIsInFront>>) {
[viewA prepareToDisplay];
[window bringSubviewToFront: viewA];
}
UIView 不一定有在前的概念。UIWindows 可以是关键,也可以不是,但并不完全相同。
您可以将视图放在前面,但这并不意味着它可见或不可见。请记住,视图可以是任意大小。
深埋在层次结构中的 UIView 可能是部分可见的,它可能是模糊的,或者它可能位于一些半透明视图的后面。同样,如果修改了不透明度值或隐藏标志,则前面的视图可能根本不可见。
我认为您想要做的是检查您的超级视图或 UIWindow 的子视图 NSArray 并进行检查。我不记得哪个是前面,但它要么是第一个对象,要么是最后一个对象。
子视图是用画家的方法绘制的。视图按从最远到最近的顺序绘制,最后绘制的对象是“前面”。
如果 viewA 在前面,以下将返回 YES:
[[viewA.superview.subviews lastObject] isEqual: viewA]
将此添加到视图控制器:
- (void)viewDidAppear:(BOOL)animated { [超级 viewDidAppear:动画]; 可见=是; } - (void)viewWillDisappear:(BOOL)animated { 可见=否; [超级viewWillDisappear:动画]; }
并检查“可见”ivar
检查 [UIView.window isKeyWindow] == YES
Swift 4 中@LucasChwe 的回答
if viewA.superview?.subviews.last == viewA { 'viewA is visible to user'}
唯一的方法是使用 [UIView tag] 为您的视图分配一个唯一标识符,然后使用 [UIView viewWithTag] 将其带到前面。
或者您可以使用标签搜索您需要的视图并对其进行处理。
for (UIView *checkView in [self.view subviews] ) {
if ([checkView tag] == whatever) {
// Do Whatever you need to do
}
}
..然后把它带到前面。
干杯
在处理模态视图时,此代码在我的根视图控制器中与我一起使用:
if(self.view == [(MyAppDelegate *)[[UIApplication sharedApplication] delegate].window.subviews objectAtIndex:0]){ ...
// stuff here
}