以编程方式添加视图时,addSubview
和insertSubView
方法之间有什么区别?
答案 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
}
这向您显示子视图的顺序已被颠倒,以模仿命中测试的深度优先的顺序树遍历过程。