Bir görünüm programlı olarak eklendiğinde yöntemler addSubview
ile insertSubView
yöntemler arasındaki fark nedir ?
Yanıtlar:
Kullanarak insertSubView:
, görünümlerin z sırasını belirleyen dizini belirtebilirsiniz. Daha yüksek endekse sahip bir görünüm, daha düşük endeksli olanların üzerinde yer alır.
1. addSubview diziye alt görünüm ekleyin ve ardından Görünüm katıcısına ekleyin
- (void)addSubview:(UIView *)subview
{
[_subviews addObject:subview];
[_layer addSublayer:subview.layer];
}
}
2. insertSubview sırasında görünümünüzü alt görünüm olarak ekleyin ve ardından arayın
[_layer insertSublayer:subview.layer atIndex:index];
- (void)insertSubview:(UIView *)subview atIndex:(NSInteger)index
{
[self addSubview:subview];
[_layer insertSublayer:subview.layer atIndex:index];
}
Farklılığa bakmanın bir başka yolu da addSubview
, alt görüntülemeleri, gözetimlerine eklendikleri sırayı ifade edecek şekilde insertSubview
eklerken, alt görüntülemeleri "çizilmesini" istediğiniz sırayla eklemenize izin vermektir.
Bu önemsiz görünebilir veya yalnızca görsel örtüşme ile ilgili olabilir, ancak aynı zamanda isabet testi veya UIResponder
zincir gibi şeyler söz konusu olduğunda da bir fark yaratır . Örneğin:
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
}
Bu size, alt görünümlerin sırasının, isabet testinin derinlik ilk ön sipariş ağaç geçiş sürecini taklit etmek için tersine çevrildiğini gösterir.