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

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

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

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

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

【问题讨论】:

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

标签: ios objective-c uiview uiviewcontroller


【解决方案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
    

    【讨论】:

      猜你喜欢
      • 2016-07-29
      • 2011-02-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-10-12
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多