如何判断UIView是否在前面(可见)?

时间:2009-04-12 00:21:41

标签: iphone uiview

我需要检测前面的哪个视图(当前可见)。我怎么能这样做?

这是我想做的事情:

if ( ! <<methodToTellIfViewAIsInFront>>) {
  [viewA prepareToDisplay];
  [window bringSubviewToFront: viewA];
}

7 个答案:

答案 0 :(得分:13)

UIView并不一定有一个在前面的概念。 UIWindows可以是关键还是不关键,但它不是一回事。

您可以在前面带一个视图,但这并不意味着它可见或不可见。请记住,视图可以是任何大小。

深埋在层次结构中的UIView可能是部分可见的,可能是模糊的,也可能是一些半透明的视图背后。同样,如果修改了不透明度值或隐藏标志,则前面的视图可能根本不可见。

我认为您要做的是检查您的superview或UIWindow的子视图NSArray并检查它。我不记得前面是哪一个,但它是第一个或最后一个对象。

使用画家的方法绘制子视图。视图按照从最远到最近的顺序绘制,最后绘制的对象是“前面”。

答案 1 :(得分:4)

如果viewA在前面,以下内容将返回YES:

[[viewA.superview.subviews lastObject] isEqual: viewA]

答案 2 :(得分:3)

将此添加到视图控制器:

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

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

并检查'可见'ivar

答案 3 :(得分:3)

检查[UIView.window isKeyWindow] == YES

答案 4 :(得分:1)

Swift 4中@LucasChwe的答案

if viewA.superview?.subviews.last == viewA { 'viewA is visible to user'}

答案 5 :(得分:0)

唯一的方法是使用[UIView标签]为视图指定唯一标识符,然后使用[UIView viewWithTag]将其带到前面。

或者您可以使用标签搜索所需的视图并进行处理..

for (UIView *checkView in [self.view subviews] ) {
      if ([checkView tag] == whatever) {
      // Do Whatever you need to do
      }
}

..然后把它带到前面。

干杯

答案 6 :(得分:-1)

在处理模态视图时,此代码在我的根视图控制器中与我一起工作:

 if(self.view == [(MyAppDelegate *)[[UIApplication sharedApplication] delegate].window.subviews objectAtIndex:0]){ ... 
          // stuff here 
     }