我需要检测哪个视图在前面(当前可见)。我该怎么做?
这是我想要做的:
if ( ! <<methodToTellIfViewAIsInFront>>) {
[viewA prepareToDisplay];
[window bringSubviewToFront: viewA];
}
UIView并没有明确的“在前面”的概念。UIWindows可以是关键或非关键,但这不完全相同。
您可以将视图带到最前面,但这并不意味着它可见或不可见。请记住,视图可以是任何大小。
在层次结构中深埋的UIView可能部分可见,可能被遮挡,也可能在一些半透明视图后面。同样,如果修改了其不透明度值或隐藏标志,位于前面的视图可能根本不可见。
我认为您想要做的是检查父视图或UIWindow的子视图NSArray,并检查那个。我记不清哪一个是在前面,但它是第一个或最后一个对象之一。
子视图使用绘画师方法绘制。从最远处到最近处按顺序绘制视图,最后绘制的对象是“前面”。
[[viewA.superview.subviews lastObject] isEqual: viewA]
检查[UIView.window isKeyWindow]是否等于YES
将以下内容添加到视图控制器中:
- (void)viewDidAppear:(BOOL)animated { [super viewDidAppear:animated]; visible = YES; }
- (void)viewWillDisappear:(BOOL)animated { visible = NO; [super viewWillDisappear:animated]; }
并检查“visible”实例变量。
@LucasChwe在Swift 4中的答案
if viewA.superview?.subviews.last == viewA { 'viewA is visible to user'}
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
}