อะไรคือความแตกต่างระหว่างaddSubviewและinsertSubViewวิธีการเมื่อมีการเพิ่มมุมมองโดยใช้โปรแกรม
อะไรคือความแตกต่างระหว่างaddSubviewและinsertSubViewวิธีการเมื่อมีการเพิ่มมุมมองโดยใช้โปรแกรม
คำตอบ:
ข้อแตกต่างเพียงอย่างเดียวคือการเพิ่มมุมมอง: ไม่ว่าจะเป็นมุมมองด้านหน้าสุด ( addSubview:) หรืออยู่ก่อนมุมมองย่อยที่ 5 ( insertSubview:atIndex:) หรืออยู่หลังมุมมองย่อยอื่น ( insertSubview:aboveSubview:) ทันที
การใช้insertSubView:คุณสามารถระบุดัชนีซึ่งกำหนดลำดับ z ของมุมมอง มุมมองที่มีดัชนีสูงกว่าจะอยู่เหนือมุมมองที่มีดัชนีต่ำกว่า
ฉันไม่คิดว่ามีความแตกต่าง addSubview:เป็นวิธีง่ายๆที่สะดวกสำหรับ
[view insertSubview:aView atIndex:[view.subviews count]]
1.addSubview เพิ่ม subview ในอาร์เรย์จากนั้นเพิ่มใน 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];
}
อีกวิธีหนึ่งในการดูความแตกต่างคือการ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
}
สิ่งนี้แสดงให้คุณเห็นว่าลำดับของมุมมองย่อยถูกย้อนกลับเพื่อเลียนแบบขั้นตอนการส่งผ่านแผนผังต้นไม้ที่สั่งซื้อล่วงหน้าล่วงหน้าในเชิงลึกของการทดสอบ Hit