Perbedaan antara addSubview dan insertSubview di kelas UIView


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:).


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.


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

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

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.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.