8

我需要检测哪个视图在前面(当前可见)。我怎样才能做到这一点?

这是我想做的事情:

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

7 回答 7

13

UIView 不一定有在前的概念。UIWindows 可以是关键,也可以不是,但并不完全相同。

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

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

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

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

于 2009-04-12T18:21:51.947 回答
5

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

[[viewA.superview.subviews lastObject] isEqual: viewA]
于 2015-10-29T17:50:47.187 回答
3

将此添加到视图控制器:

- (void)viewDidAppear:(BOOL)animated {
 [超级 viewDidAppear:动画];
 可见=是;
}

- (void)viewWillDisappear:(BOOL)animated {
 可见=否;
 [超级viewWillDisappear:动画];
}

并检查“可见”ivar

于 2010-05-27T16:32:51.327 回答
3

检查 [UIView.window isKeyWindow] == YES

于 2012-11-22T07:52:26.600 回答
1

Swift 4 中@LucasChwe 的回答

if viewA.superview?.subviews.last == viewA { 'viewA is visible to user'}
于 2018-06-28T12:24:50.180 回答
0

唯一的方法是使用 [UIView tag] 为您的视图分配一个唯一标识符,然后使用 [UIView viewWithTag] 将其带到前面。

或者您可以使用标签搜索您需要的视图并对其进行处理。

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

..然后把它带到前面。

干杯

于 2009-04-12T02:26:43.663 回答
-1

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

 if(self.view == [(MyAppDelegate *)[[UIApplication sharedApplication] delegate].window.subviews objectAtIndex:0]){ ... 
          // stuff here 
     }
于 2013-07-26T00:06:26.457 回答