Anda menemukan efek samping dari fitur baru yang fantastis di Tampilan Tabel iOS8: Ketinggian Baris Otomatis.
Di iOS 7, Anda memiliki baris dengan ukuran tetap (diatur dengan tableView.rowHeight
), atau Anda akan menulis kode untuk menghitung tinggi sel Anda dan Anda akan mengembalikannya tableView:heightForRowAtIndexPath
. Menulis kode untuk menghitung tinggi sel bisa jadi sangat rumit jika Anda memiliki banyak tampilan di sel Anda dan Anda memiliki ketinggian berbeda untuk dipertimbangkan pada ukuran font yang berbeda. Tambahkan Dynamic Type dan prosesnya sangat menyebalkan.
Di iOS 8, Anda masih dapat melakukan hal di atas, tetapi sekarang tinggi baris dapat ditentukan oleh iOS, asalkan Anda telah mengkonfigurasi konten sel Anda menggunakan Tata Letak Otomatis. Ini adalah keuntungan besar bagi pengembang, karena saat ukuran font dinamis berubah, atau pengguna mengubah ukuran teks menggunakan Pengaturan Aksesibilitas, UI Anda dapat beradaptasi dengan ukuran baru. Ini juga berarti jika Anda memiliki UILabel yang dapat memiliki beberapa baris teks, sel Anda sekarang dapat tumbuh untuk mengakomodasi baris tersebut saat sel membutuhkannya, dan menyusut jika tidak diperlukan, sehingga tidak ada spasi kosong yang tidak perlu.
Pesan peringatan yang Anda lihat memberi tahu Anda bahwa tidak ada batasan yang cukup di sel Anda untuk Tata Letak Otomatis untuk menginformasikan tampilan tabel ketinggian sel.
Untuk menggunakan tinggi sel dinamis, yang, bersama dengan teknik yang telah disebutkan oleh poster lain, juga akan menghilangkan pesan ini, Anda perlu memastikan sel Anda memiliki batasan yang memadai untuk mengikat item UI ke bagian atas dan bawah sel. Jika Anda pernah menggunakan Tata Letak Otomatis sebelumnya, Anda mungkin terbiasa menyetel batasan Atas + Utama, tetapi tinggi baris dinamis juga memerlukan batasan bawah.
Layout pass berfungsi seperti ini, yang terjadi tepat sebelum sel ditampilkan di layar, dengan cara tepat waktu:
Dimensi konten dengan ukuran intrinsik dihitung. Ini termasuk UILabels dan UIImageViews, yang dimensinya masing-masing didasarkan pada teks atau gambar UII yang dikandungnya. Kedua tampilan ini akan menganggap lebarnya diketahui (karena Anda telah menyetel batasan untuk tepi belakang / depan, atau Anda menyetel lebar eksplisit, atau Anda menggunakan batasan horizontal yang akhirnya memperlihatkan lebar dari sisi ke sisi). Misalkan sebuah label memiliki paragraf teks ("jumlah baris" disetel ke 0 sehingga akan otomatis terbungkus), itu hanya boleh menyilang 310 poin, jadi tinggi 120pt ditentukan pada ukuran font saat ini.
UI diatur sesuai dengan batasan pemosisian Anda. Ada batasan di bagian bawah label yang menghubungkan ke margin bawah sel. Karena label telah berkembang menjadi 120 poin, dan karena terikat ke bagian bawah sel oleh pembatas, label harus mendorong sel "ke bawah" (meningkatkan tinggi sel) untuk memenuhi pembatas yang bertuliskan "bagian bawah jarak label selalu standar dari bagian bawah sel.
Pesan kesalahan yang Anda laporkan terjadi jika batasan bawah itu hilang, dalam hal ini tidak ada yang "mendorong" bagian bawah sel menjauh dari bagian atas sel, yang merupakan ambiguitas yang dilaporkan: tanpa ada yang mendorong bagian bawah bagian atas, sel itu runtuh. Namun Tata Letak Otomatis juga mendeteksinya, dan kembali menggunakan tinggi baris standar.
Untuk apa nilainya, dan sebagian besar memiliki jawaban bulat, jika Anda menerapkan tinggi baris dinamis berbasis Tata Letak Otomatis iOS 8, Anda harus menerapkan tableView:estimatedHeightForRowAtIndexPath:
. Metode perkiraan itu bisa menggunakan nilai kasar untuk sel Anda, dan itu akan dipanggil saat tampilan tabel pertama kali dimuat. Ini membantu UIKit menggambar hal-hal seperti scrollbar, yang tidak dapat ditarik kecuali jika tampilan tabel mengetahui berapa banyak konten yang dapat digulir, tetapi tidak memerlukan ukuran yang benar-benar akurat, karena ini hanya scrollbar. Ini memungkinkan penghitungan tinggi baris yang sebenarnya ditunda hingga saat sel dibutuhkan, yang kurang intensif secara komputasi dan memungkinkan UITableView Anda disajikan lebih cepat.