【问题标题】:How to reference "top-most" view?如何引用“最顶层”视图?
【发布时间】:2011-12-22 09:10:18
【问题描述】:

iOS 中,如何以编程方式找到top most UIView 是什么?

换句话说..现在显示什么视图?

说,我有一个 3 个视图堆叠在一起的笔尖。在程序内部,如果我知道它是什么,我可以删除顶视图。我怎样才能知道笔尖上的视图是什么?

【问题讨论】:

    标签: ios uiview hierarchy


    【解决方案1】:

    您可以拥有很多最热门的视图,因为视图不必占据整个屏幕。

    如果你想要一个视图的最顶层子视图,你可以调用

    [yourView subviews];
    

    并取最后一个(它们按显示顺序,最前面最后一个)

    [[yourView subviews] objectAtIndex:[[yourView subviews] count]];
    

    编辑:这更好(来自 cmets)

    [[yourView subviews] lastObject];
    

    如果您知道显示的 viewController,只需将 yourView 替换为 yourController.view

    【讨论】:

    • 别忘了测试 isHidden。并且 .alpha != 0。并且视图在屏幕上。
    • 在你的例子中,我怎么知道yourView 是什么?
    • 正如我在上一句中所说,如果 yourMainViewController 是处理显示视图的控制器(例如,如果您没有添加任何 modalViewController 或没有推送,则 yourView 可以是 yourMainViewController.view导航控制器中的任何控制器)。更一般地说,它是您知道当前显示的第一个视图。如果您想要更准确的答案,您需要解释您的应用程序是什么以及它正在显示什么,我也许可以告诉您您必须使用什么视图。
    • PS 只是在那个 objC 中使用“lastObject”
    • 您也可以使用 HitTest。该方法将返回一个虚拟触摸的对象。
    【解决方案2】:

    这样

    UIView *topMost = [[self.view subviews] lastObject];
    

    【讨论】:

      【解决方案3】:

      或者像这样

      UIWindow *window = [[UIApplication sharedApplication].keyWindow;
      UIView *topMost = [window findTopMostViewForPoint:CGPointMake(100, 100)];
      

      功能

      @implementation UIView (Extra)
      
      - (UIView *)findTopMostViewForPoint:(CGPoint)point
      {
          for(int i = self.subviews.count - 1; i >= 0; i--)
          {
              UIView *subview = [self.subviews objectAtIndex:i];
              if(!subview.hidden && CGRectContainsPoint(subview.frame, point))
              {
                  CGPoint pointConverted = [self convertPoint:point toView:subview];
                  return [subview findTopMostViewForPoint:pointConverted];
              }
          }
      
          return self;
      }
      
      - (BOOL)isTopmostViewInWindow
      {
          if(self.window == nil)
          {
              return NO;
          }
      
          CGPoint centerPointInSelf = CGPointMake(CGRectGetMidX(self.bounds), CGRectGetMidY(self.bounds));
          CGPoint centerPointOfSelfInWindow = [self convertPoint:centerPointInSelf toView:self.window];
          UIView *view = [self.window findTopMostViewForPoint:centerPointOfSelfInWindow];
          BOOL isTopMost = view == self || [view isDescendantOfView:self];
          return isTopMost;
      }
      
      @end
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-07-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-08-28
        • 1970-01-01
        相关资源
        最近更新 更多