Apa yang terjadi dengan batasan saat tampilan dihapus

109

Pertanyaan yang saya miliki sederhana tetapi saya tidak dapat menemukan informasi apa pun di dalam dokumentasi.

Apa yang terjadi dengan batasan tata letak saat tampilan dihapus dari hierarki tampilan (atau dipindahkan ke tampilan lain)?

Sebagai contoh, mari kita Cbuat wadah dengan subview Adan B. Penampung Cmemiliki beberapa kendala. Lalu kami menelepon [A removeFromSuperview]. Apa yang terjadi dengan kendala untuk A?

Apa yang kemudian terjadi jika kita menambahkan Ake Clagi?

Sulthan
sumber

Jawaban:

118

Kendala dihilangkan. Jika Anda menambahkan A lagi, Anda harus membuat batasan baru untuk itu, atau jika Anda menyimpan batasan sebelum Anda menghapus A, Anda dapat menambahkannya kembali. Ketika saya melakukan sesuatu seperti ini, saya menyimpan batasan seperti ini untuk tampilan yang disebut view1:

self.portraitConstraints = [NSMutableArray new];
for (NSLayoutConstraint *con in self.view.constraints) {
    if (con.firstItem == self.view1 || con.secondItem == self.view1) {
       [self.portraitConstraints addObject:con];
    }
}
rdelmar.dll
sumber
7
Bisakah fakta ini ditemukan di suatu tempat di dokumentasi? Saya percaya Anda tetapi tampaknya aneh fakta tidak disebutkan di mana pun.
Sulthan
2
Akal sehat bahwa kendala dihapus bersama dengan tampilan benar-benar. Jika tidak, bagaimana sistem tata letak dapat mengevaluasi mereka di masa mendatang?
Mike Pollard
6
Karena sejelas jawaban ini, itu masih sangat membantu!
race_carr
1
@pnollet, saya tidak tahu mengapa poster dalam pertanyaan itu melakukan apa yang dia lakukan. Saya telah mencatat ini untuk memverifikasi, dan ketika saya menghapus subview, dan memeriksa batasan di superview, batasan yang terkait dengan subview yang dihapus hilang.
rdelmar
4
@Firo, saya yakin mereka seharusnya dihapus, jadi jika mereka tidak ada di iOS 6, itu mungkin bug. BTW, dokumen untuk metode removeFromSuperview mengatakan, "Memanggil metode ini menghilangkan batasan apa pun yang merujuk ke tampilan yang Anda hapus, atau yang merujuk ke tampilan apa pun di subpohon tampilan yang Anda hapus".
rdelmar
41

Karena saya punya pertanyaan ini juga, saya memeriksa Apple Docs hanya untuk iseng, dan ternyata didokumentasikan bahwa kendala dihapus.

The dokumentasi untuk metode UIView removeFromSuperview negara:

Memanggil metode ini menghilangkan batasan apa pun yang merujuk ke tampilan yang Anda hapus, atau yang merujuk ke tampilan apa pun di subpohon tampilan yang Anda hapus.

Saya tidak yakin apakah ini didokumentasikan tahun lalu ketika pertanyaan asli diposting, tetapi saya hanya berpikir saya akan membagikan informasi ini jika ada yang membutuhkannya ...

Evan Stone
sumber
Terima kasih yang luar biasa untuk menambahkan ini langsung dari dokumen
Esko918
3

Namun perlu diketahui, jika Anda memiliki dua tampilan induk independen A dan B, dan subview C, di mana C saat ini adalah subview dari A, dengan batasan yang sesuai, bahwa memanggil [B addSubview: C] TIDAK akan menghapus batasan apa pun yang terkait dengan A dan C, dan tata letak otomatis akan mulai menampilkan pengecualian, karena batasan tersebut tidak lagi terkait dengan tampilan dalam hierarki yang sama.

Anda perlu memanggil [C removeFromSuperview] secara eksplisit untuk menghapus batasan, sebelum menambahkan C ke B.

Ini benar di Mac OS X - Saya belum memeriksa iOS

Martin Redington
sumber
Menarik! Darimana Anda mendapatkan informasi ini? Dokumen untuk addSubview tidak menyebutkan perilaku ini. Saya bertanya karena saat ini saya memiliki pengecualian sporadis, saat menghapus pengontrol tampilan, yang menyatakan 'Tidak dapat memasang batasan pada tampilan' - sesuatu yang tidak saya lakukan.
JimmyB
2

Batasan juga dihapus saat Anda [A removeFromSuperview]

Mereka dilupakan dan menambahkan A ke C lagi tidak menambah batasan.

Mike Pollard
sumber
0

Mereka juga dihapus, Anda dapat melakukan tes sederhana. Ambil tampilan SUBVIEW dan buat batasan biaya yang membatasi SUBVIEW untuk mengikuti pengubahan ukuran tampilan supernya (seperti melekat pada tepi superview). Untuk melakukan itu Anda menambahkan SUBVIEW sebagai subview untuk CONTAINERVIEW ini dan menambahkan sebagai kendala seperti itu:
V: | - [SUBVIEW] - |
H: | - [SUBVIEW] - |
Batasan ini harus ditambahkan ke superview SUBVIEW, jadi CONTAINERVIEW.
Jika Anda menghapus SUBVIEW hanya dengan memeriksa semua kendala CONTAINERVIEW Anda dapat melihat bahwa dua tidak ada lagi.

Andrea
sumber
0

Pertanyaan ini juga dapat dibuktikan oleh pembuat antarmuka. Ketika drag and drop a UIViewpada ViewControlleradd constraints lalu hapus UIView, Anda bisa melihat constraints biru menghilang.

William Hu
sumber
4
Storyboard tidak membuktikan apa pun tentang bagaimana perilaku runtime akan terjadi. Papan cerita dapat melakukan apa pun yang diinginkannya!
mxcl