【问题标题】:How can I tell if a UIView is in front (visible)?如何判断 UIView 是否在前面(可见)?
【发布时间】:2010-10-18 23:15:37
【问题描述】:

我需要检测哪个视图在前面(当前可见)。我该怎么做?

这是我想做的事情:

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

【问题讨论】:

标签: iphone uiview


【解决方案1】:

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

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

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

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

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

【讨论】:

  • 对于 UIViews,子视图数组索引 0 处的子视图是最靠后的一个,其他子视图按顺序绘制在该子视图之上。
  • 我正在调试检查子视图,发现最后一个子视图是前面的。
  • 感谢布拉德,安德鲁的跟进。
【解决方案2】:

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

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

【讨论】:

【解决方案3】:

将此添加到视图控制器:

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

并检查“可见”ivar

【讨论】:

  • 使用 self.window != nil,省去布尔值。
  • 这可能没有帮助。我这里有一个案例,其中“viewDidAppear”被调用,但视图实际上是不可见的。
  • 这些方法无济于事,因为它们仅在视图被添加到视图层次结构/从视图层次结构中删除时调用,而不是在视图变得可见/不可见时调用。
【解决方案4】:

检查 [UIView.window isKeyWindow] == YES

【讨论】:

  • 这不会告诉你视图是否真正可见,但它会告诉你视图所属的窗口是否是当前关键窗口。
【解决方案5】:

Swift 4 中@LucasChwe 的答案

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

【讨论】:

    【解决方案6】:

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

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

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

    ..然后把它带到前面。

    干杯

    【讨论】:

      【解决方案7】:

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

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

      【讨论】:

      • 如果窗口没有子视图,则不回答问题并导致崩溃。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-07-29
      • 2011-02-16
      • 2014-05-03
      • 1970-01-01
      • 2010-09-12
      相关资源
      最近更新 更多