Pemahaman saya tentang autolayout adalah bahwa diperlukan ukuran superview dan berdasarkan batasan dan ukuran intrinsik yang menghitung posisi subview.
Apakah ada cara untuk membalik proses ini? Saya ingin mengubah ukuran superview berdasarkan batasan dan ukuran intrinsik. Apa cara paling sederhana untuk mencapai ini?
Saya telah melihat dirancang dalam Xcode yang saya gunakan sebagai header untuk UITableView
. Tampilan ini termasuk label dan tombol. Ukuran label berbeda tergantung pada data. Tergantung pada batasan, label berhasil menekan tombol ke bawah atau jika ada kendala antara tombol dan bagian bawah superview label dikompresi.
Saya telah menemukan beberapa pertanyaan serupa tetapi mereka tidak memiliki jawaban yang baik dan mudah.
Jawaban:
API yang benar untuk digunakan adalah
UIView systemLayoutSizeFittingSize:
, melewati salah satuUILayoutFittingCompressedSize
atauUILayoutFittingExpandedSize
.Untuk
UIView
penggunaan autolayout yang normal, ini hanya akan berfungsi selama kendala Anda benar. Jika Anda ingin menggunakannya padaUITableViewCell
(untuk menentukan tinggi baris misalnya) maka Anda harus menyebutnya terhadap sel AndacontentView
dan ambil tingginya.Pertimbangan lebih lanjut ada jika Anda memiliki satu atau lebih UILabel dalam pandangan Anda yang multiline. Untuk ini, sangat penting bahwa
preferredMaxLayoutWidth
properti diatur dengan benar sehingga label memberikan yang benarintrinsicContentSize
, yang akan digunakan dalamsystemLayoutSizeFittingSize's
perhitungan.EDIT: dengan permintaan, menambahkan contoh perhitungan tinggi untuk sel tampilan tabel
Menggunakan autolayout untuk penghitungan tinggi sel tabel tidak super efisien tetapi tentu saja nyaman, terutama jika Anda memiliki sel yang memiliki tata letak yang kompleks.
Seperti yang saya katakan di atas, jika Anda menggunakan multiline,
UILabel
sangat penting untuk menyinkronkanpreferredMaxLayoutWidth
ke lebar label. Saya menggunakanUILabel
subkelas khusus untuk melakukan ini:Berikut ini adalah subclass UITableViewController yang dibuat yang memperlihatkan heightForRowAtIndexPath:
Sel khusus sederhana:
Dan, inilah gambar kendala yang didefinisikan di Storyboard. Perhatikan bahwa tidak ada batasan tinggi / lebar pada label - itu disimpulkan dari label
intrinsicContentSize
:sumber
sizingCell
atau itucontentView
.sizingCell
lebar Anda cocok dengantableView
lebar Anda.Komentar Eric Baker memberi saya ide inti bahwa agar suatu tampilan dapat ditentukan ukurannya oleh konten yang ditempatkan di dalamnya, maka konten yang ditempatkan di dalamnya harus memiliki hubungan eksplisit dengan tampilan yang mengandung untuk mendorong ketinggiannya. (atau lebar) secara dinamis . "Tambahkan subview" tidak membuat hubungan ini seperti yang Anda asumsikan. Anda harus memilih subview mana yang akan mengarahkan tinggi dan / atau lebar wadah ... paling umum apa pun elemen UI yang telah Anda tempatkan di sudut kanan bawah keseluruhan UI Anda. Berikut beberapa kode dan komentar sebaris untuk mengilustrasikan intinya.
Catatan, ini mungkin bernilai khusus bagi mereka yang bekerja dengan tampilan gulir karena biasanya dirancang di sekitar tampilan konten tunggal yang menentukan ukurannya (dan mengomunikasikan ini ke tampilan gulir) secara dinamis berdasarkan pada apa pun yang Anda masukkan ke dalamnya. Semoga beruntung, semoga ini membantu seseorang di luar sana.
sumber
Anda dapat melakukan ini dengan membuat batasan dan menghubungkannya melalui pembuat antarmuka
Lihat penjelasan: Auto_Layout_Constraints_in_Interface_Builder
raywenderlich begin-auto-layout
AutolayoutPG Artikel membatasi Fundamentals
hubungkan outlet Constraint ini dengan sub-view Anda Constraint atau hubungkan juga super views Constraint dan atur sesuai dengan kebutuhan Anda seperti ini
Saya harap ini menjelaskannya.
sumber
Ini dapat dilakukan untuk yang normal
subview
di dalam yang lebih besarUIView
, tetapi tidak bekerja secara otomatis untukheaderViews
. Ketinggian dariheaderView
ditentukan oleh apa yang dikembalikan olehtableView:heightForHeaderInSection:
sehingga Anda harus menghitungheight
berdasarkanheight
dariUILabel
ruang plus untukUIButton
dan setiappadding
Anda perlu. Anda perlu melakukan sesuatu seperti ini:Berikut
headerString
adalah string apa pun yang Anda inginkan untuk mengisiUILabel
, dan nomor 281 adalahwidth
dariUILabel
(seperti pengaturan diInterface Builder
)sumber