如何检查视图而不是 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?