UIView类中addSubview和insertSubview之间的区别

时间:2009-10-05 09:54:38

标签: iphone uiview uikit subview addsubview

以编程方式添加视图时,addSubviewinsertSubView方法之间有什么区别?

5 个答案:

答案 0 :(得分:101)

唯一的区别在于添加视图的位置:它是最前面的视图(addSubview:),还是在第5个子视图之前,(insertSubview:atIndex:)或者是否紧接在另一个视图之后子视图(insertSubview:aboveSubview:)。

答案 1 :(得分:45)

使用insertSubView:可以指定索引,该索引确定视图的z顺序。索引较高的视图位于指数较低的视图之上。

答案 2 :(得分:29)

我认为没有区别。 <{1}}对于

来说简单方便
addSubview:

答案 3 :(得分:0)

1.addSubview在数组中添加子视图,然后在View'slayer中添加

- (void)addSubview:(UIView *)subview
{
    [_subviews addObject:subview];
    [_layer addSublayer:subview.layer];
}

}

2.使用insertSubview将您的视图添加为子视图然后调用 [_layer insertSublayer:subview.layer atIndex:index];

- (void)insertSubview:(UIView *)subview atIndex:(NSInteger)index
{
  [self addSubview:subview];
  [_layer insertSublayer:subview.layer atIndex:index];
}

答案 4 :(得分:0)

查看差异的另一种方法是addSubview以表示子视图添加到其父视图的顺序的方式添加子视图,而insertSubview允许您在以下位置添加子视图:您希望它们“绘制”的顺序。

这似乎微不足道或仅与视觉重叠有关,但是在命中测试或UIResponder链之类的事情上也有所不同。例如:

override func hitTest(_ point: CGPoint, with event: UIEvent?) -> UIView? {
    if let hitView = super.hitTest(point, with:event) {
        return hitView
    }
    for subview in self.subviews.reversed() {
        let hitPoint = self.convert(point, to:subview)
        if let hitView = sub.hitTest(hitPoint, with:event) {
            return hitView
        }
    }
    return nil
}

这向您显示子视图的顺序已被颠倒,以模仿命中测试的深度优先的顺序树遍历过程。