อะไรคือความแตกต่างระหว่าง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