如何检查视图而不是 viewController 是不是可见?

Posted

技术标签:

【中文标题】如何检查视图而不是 viewController 是不是可见?【英文标题】:How to check if view, not viewController, is visible or not?如何检查视图而不是 viewController 是否可见? 【发布时间】:2015-08-27 11:58:53 【问题描述】:

是否有办法检查视图,视图控制器的子视图现在是否可见?

我检查了link 1、link 2 和link 3。所有这些帖子都讨论了 UIViewController 的视图,并根据视图的 window 属性编写了条件。 但我想检查一个视图是否现在可见或被其他视图覆盖或隐藏,我无法使用以下条件。

if (viewController.isViewLoaded && viewController.view.window) 
  // viewController is visible

对我如何做到这一点有任何帮助吗?谢谢。

【问题讨论】:

通常你(或你的代码)应该知道对视图层次结构做了什么,并且在那里可见或在前面。您能解释一下为什么需要找出它,以便我们能够提出更好的方法吗? 我的项目一团糟,最初是由以前的开发人员作为购物车开始的,现在是独轮车的形状,带有法拉利风格的屋顶和引擎盖。所以不要问。情况是,在视图控制器上的自定义视图上有一个 imageView :)。我需要为 imageView 调用 bringSubviewToFront: 方法和另一个自定义方法,只有当没有其他视图超过该自定义视图时。 【参考方案1】:

一个 UIView 有一个 superview 属性和一个 window 属性。您可以检查这些是否为nil。如果视图有一个 nil 超级视图,那么它还没有被添加到任何东西并且是不可见的。

如果视图确实有一个不是nil 的超级视图属性,那么您可以查看超级视图的subviews 数组属性来确定视图堆栈(0 在后面)。

如果您的视图不在堆栈的前面,您需要查看它前面的其他视图的框架矩形以确定它们是否覆盖了它。就个人而言,我会使用CGRectIntersection 命令进行测试。

一个 UIView 也有一个 hidden 属性,您可以检查它以及一个 alpha 属性,如果它被设置为 0 会使视图不可见。

【讨论】:

【参考方案2】:

您可以使用此代码获取视图的索引并确定它是否在前面

UIView* view1 = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 50, 50)];
NSLog(@"%d", [[self.view subviews] indexOfObject:view1]); // Is 1

【讨论】:

以上是关于如何检查视图而不是 viewController 是不是可见?的主要内容,如果未能解决你的问题,请参考以下文章

我如何在另一个类而不是 ViewController 中实现.GMSMapViewDelegate

如何检查具有指定标识符的视图控制器是不是可用

如何填充表格视图,而不是表格视图控制器?

如何将约束添加到根视图而不是 TopLayoutGuide?

试图了解 Firebase screen_view 事件的 ViewController 焦点

在 NavigationIOS 中推送视图时如何传递对象而不是类型?