Perbedaan antara addSubview dan insertSubview di kelas UIView

86

Apa perbedaan antara addSubviewdan insertSubViewmetode saat tampilan ditambahkan secara terprogram?

Ashwani K
sumber

Jawaban:

103

Satu-satunya perbedaan adalah di mana tampilan ditambahkan: apakah itu tampilan paling depan ( addSubview:), atau sebelum subview ke-5, ( insertSubview:atIndex:) atau jika tepat di belakang subview lain ( insertSubview:aboveSubview:).

mahboudz.dll
sumber
46

Menggunakan insertSubView:Anda dapat menentukan indeks, yang menentukan urutan-z tampilan. Tampilan dengan indeks lebih tinggi terletak di atas indeks dengan indeks lebih rendah.

Nikolai Ruhe
sumber
Terima kasih, saya ingin apakah ada perbedaan khusus dalam penggunaan kedua fungsi ini
Ashwani K
1
Selain perbedaan spesifik yang saya jelaskan dalam jawaban saya, tidak ada.
Nikolai Ruhe
29

Saya rasa tidak ada perbedaan. addSubview:adalah metode sederhana yang nyaman untuk

[view insertSubview:aView atIndex:[view.subviews count]]
sliver
sumber
0

1.addSubview menambahkan subview di array lalu tambahkan di View'slayer

- (void)addSubview:(UIView *)subview
{
    [_subviews addObject:subview];
    [_layer addSublayer:subview.layer];
}

}

2. Saat insertSubview menambahkan tampilan Anda sebagai subview lalu panggil [_layer insertSublayer:subview.layer atIndex:index];

- (void)insertSubview:(UIView *)subview atIndex:(NSInteger)index
{
  [self addSubview:subview];
  [_layer insertSublayer:subview.layer atIndex:index];
}
pengguna2369870
sumber
0

Cara lain untuk melihat perbedaannya adalah dengan addSubviewmenambahkan subview dengan cara yang menandakan urutan di mana mereka telah ditambahkan ke superview mereka, sedangkan insertSubviewmemungkinkan Anda untuk menambahkan subview dalam urutan yang Anda inginkan untuk "digambar".

Ini mungkin tampak sepele atau hanya berkaitan dengan visual yang tumpang tindih, tetapi juga membuat perbedaan dalam hal-hal seperti pengujian hit atau UIResponderrantai. Sebagai contoh:

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
}

Ini menunjukkan bahwa urutan subview telah dibalik untuk meniru proses traversal pohon pre-order depth-first dari pengujian hit.

Kevvv
sumber