代码之家  ›  专栏  ›  技术社区  ›  August Lilleaas

以编程方式获取UIView相对于其同级视图的“Z”位置

  •  1
  • August Lilleaas  · 技术社区  · 14 年前

    我的类具有在层次结构的特定级别插入视图的逻辑。

    containerView = [[UIView alloc] init];
    shadowView = [[UIView alloc] init];
    contentView = [[UIView alloc init];
    [containerView addSubview:shadowView];
    [containerView insertSubview:contentView belowSubview:shadowView];
    

    稍后,它会翻转它们,使阴影视图位于内容视图的下方而不是上方。

    // "Flipping" their positions.
    [containerView insertSubview:contentView aboveSubview:shadowView];
    

    subviews 属性返回NSArray,不幸的是,该数组没有反映视图堆栈顺序。

    下面是一个测试的例子。

    - (void)testViewHierarchyFlipping {
       STAssertEquals(containerView, shadowView.superview, nil);
       STAssertEquals(containerView, contentView.superview, nil);
       // Test that shadowView is ABOVE contentView.
    }
    
    1 回复  |  直到 14 年前
        1
  •  1
  •   Greg    14 年前

    你可以检查 containerView.subviews 属性确定每个子视图的Z位置。

    数组开头的项比数组末尾的项深。

    我相信这对您的测试是有效的,尽管我现在没有访问Xcode的权限来验证它是否正确。

    - (void)testViewHierarchyFlipping {
       STAssertEquals(containerView, shadowView.superview, nil);
       STAssertEquals(containerView, contentView.superview, nil);
    
       // Test that shadowView is ABOVE contentView.
       UIView *topView = (UIView *)[[containerView subviews] lastObject];
       UIView *bottomView = (UIView *)[[containerView subviews] objectAtIndex:0];
       STAssertEquals(shadowView, topView, nil);
       STAssertEquals(contentView, bottomView, nil);
    }