UIView sınıfında addSubview ve insertSubview arasındaki fark


Yanıtlar:


103

Tek fark, görünümün nerede eklendiğidir: ister en öndeki görünüm ( addSubview:), ister 5. alt görünümden önce ( insertSubview:atIndex:) veya başka bir alt görünümün ( insertSubview:aboveSubview:) hemen arkasında mı ( ).


46

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.


Teşekkürler, bu iki işlevin kullanımında belirli bir fark olup olmadığını istedim
Ashwani K

1
Cevabımda anlattığım spesifik farklılığın yanı sıra, hiçbiri yok.
Nikolai Ruhe

29

Bir fark olduğunu sanmıyorum. addSubview:basit, uygun bir yöntemdir

[view insertSubview:aView atIndex:[view.subviews count]]

0

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];
}

0

Farklılığa bakmanın bir başka yolu da addSubview, alt görüntülemeleri, gözetimlerine eklendikleri sırayı ifade edecek şekilde insertSubvieweklerken, 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 UIResponderzincir 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.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.