Saya membuat aplikasi yang akan memiliki pertanyaan UILabel
dan jawaban pilihan ganda ditampilkan di UITableView
, setiap baris menunjukkan pilihan ganda. Pertanyaan dan jawaban akan berbeda-beda, jadi saya perlu UITableView
ketinggian dinamis.
Saya ingin mencari sizeToFit
pekerjaan di sekitar meja. Di mana bingkai tabel diatur ke ketinggian semua kontennya.
Adakah yang bisa memberi saran tentang bagaimana saya bisa mencapai ini?
- sizeToFit
metode UIView ?Jawaban:
Sebenarnya saya menemukan jawabannya sendiri.
Saya cukup membuat baru
CGRect
untuktableView.frame
denganheight
daritable.contentSize.height
Yang menentukan ketinggian
UITableView
keheight
kontennya. Karena kode memodifikasi UI, jangan lupa untuk menjalankannya di utas utama:sumber
Solusi Swift 5 dan 4.2 tanpa KVO, DispatchQueue, atau menetapkan batasan sendiri.
Solusi ini didasarkan pada jawaban Gulz .
1) Buat subkelas dari
UITableView
:2) Tambahkan
UITableView
ke tata letak Anda dan atur batasan di semua sisi. Atur kelasnya menjadiContentSizedTableView
.3) Anda akan melihat beberapa kesalahan, karena Storyboard tidak memperhitungkan subclass kami
intrinsicContentSize
. Perbaiki ini dengan membuka inspektur ukuran dan menimpa intrinsicContentSize ke nilai placeholder. Ini merupakan penggantian untuk waktu desain. Saat runtime akan menggunakan override diContentSizedTableView
kelas kamiPembaruan: Kode yang diubah untuk Swift 4.2. Jika Anda menggunakan versi sebelumnya, gunakan
UIViewNoIntrinsicMetric
sebagai gantiUIView.noIntrinsicMetric
sumber
tableView
menjadiIntrinsicTableView
di storyboard. Saya tidak perlu menyematkan tampilan meja saya di tempat lainUIView
.tableView
keIntrinsicTableView
. JugaUIView
tidak diperlukan pembungkus tambahan . Anda tentu saja dapat menggunakan tampilan induk apa pun yang ada :)tableView.sizeToFit()
sizeToFit()
perlu dipanggilSolusi Cepat
Ikuti langkah ini:
1- Atur batasan ketinggian untuk tabel dari storyboard.
2- Seret batasan ketinggian dari storyboard dan buat @IBOutlet untuknya dalam file view controller.
3 - Kemudian Anda dapat mengubah ketinggian untuk tabel secara dinamis menggunakan kode ini:
Memperbarui
Jika baris terakhir dipotong untuk Anda, coba panggil viewWillLayoutSubviews () di fungsi sel willDisplay:
sumber
Saya sudah mencoba ini di iOS 7 dan itu berhasil untuk saya
sumber
Tambahkan pengamat untuk properti contentSize pada tampilan tabel, dan sesuaikan ukuran bingkai sesuai
lalu di callback:
Semoga ini bisa membantu Anda.
sumber
Saya memiliki tampilan tabel di dalam tampilan gulir dan harus menghitung tinggi tableView dan mengubah ukurannya. Itu adalah langkah-langkah yang telah saya ambil:
0) tambahkan UIView ke scrollView Anda (mungkin akan bekerja tanpa langkah ini, tetapi saya melakukannya untuk menghindari kemungkinan konflik) - ini akan menjadi tampilan containr untuk tampilan tabel Anda. Jika Anda mengambil langkah ini, maka atur batas tampilan langsung ke tampilan tabel.
1) membuat subkelas dari UITableView:
2) mengatur kelas tampilan tabel di Storyboard ke IntrinsicTableView: tangkapan layar: http://joxi.ru/a2XEENpsyBWq0A
3) Setel batasan ketinggian ke tampilan tabel Anda
4) seret IBoutlet tabel Anda ke ViewController Anda
5) seret IBoutlet dari batasan ketinggian tabel Anda ke ViewController Anda
6) tambahkan metode ini ke dalam ViewController Anda:
Semoga ini membantu
sumber
Jika Anda tidak ingin melacak ukuran konten tampilan tabel berubah sendiri, Anda mungkin menemukan subkelas ini berguna.
sumber
override public var intrinsicContentSize: CGSize { //... return someCGSize }
Jika konten Anda Ukuran tidak benar, ini karena didasarkan pada taksiranRowHeight (otomatis), gunakan ini sebelum
sumber: https://forums.developer.apple.com/thread/81895
sumber
Swift 3, iOS 10.3
Solusi 1: Hanya menempatkan
self.tableview.sizeToFit()
dicellForRowAt indexPath
fungsi. Pastikan untuk mengatur tinggi tampilan tabel lebih tinggi dari yang Anda butuhkan. Ini adalah solusi yang baik jika Anda tidak memiliki pandangan di bawah tampilan tabel. Namun, jika sudah, batasan tableview bawah tidak akan diperbarui (saya tidak mencoba memperbaikinya karena saya datang dengan solusi 2)Contoh:
Solusi 2: Atur batasan ketinggian tampilan tabel di storyboard dan seret ke ViewController. Jika Anda tahu tinggi rata-rata sel Anda dan Anda tahu berapa banyak elemen yang terdapat dalam array Anda, Anda dapat melakukan sesuatu seperti ini:
* EDIT:
Setelah semua solusi saya coba dan semuanya memperbaiki sesuatu, tetapi tidak sepenuhnya, ini adalah jawaban yang menjelaskan dan memperbaiki masalah ini sepenuhnya.
sumber
Jawaban Mimo dan jawaban Anooj VM keduanya mengagumkan, tetapi ada masalah kecil jika Anda memiliki daftar besar, mungkin tinggi frame akan memotong beberapa sel Anda.
Begitu. Saya telah memodifikasi sedikit jawabannya:
sumber
Ada cara yang lebih baik untuk melakukannya jika Anda menggunakan AutoLayout: ubah kendala yang menentukan ketinggian. Hitung saja tinggi isi tabel Anda, kemudian temukan kendala dan ubahlah. Berikut ini sebuah contoh (dengan asumsi bahwa batasan yang menentukan tinggi tabel Anda sebenarnya adalah batasan ketinggian dengan relasi "Equal"):
sumber
myTableHeightConstraint.constant = tableView.contentSize.height
Ini berfungsi untuk saya menggunakan Tata Letak Otomatis, dengan tampilan tabel dengan hanya satu bagian.
Saya memanggil fungsi ini ketika mengatur Tata Letak Otomatis (Sampel di sini menggunakan SnapKit, tetapi Anda mendapatkan idenya):
Saya ingin UITableView hanya setinggi gabungan sel; Saya memutar melalui sel dan mengakumulasi tinggi total sel. Karena ukuran tampilan tabel adalah CGRect.zero pada titik ini, saya perlu mengatur batas untuk dapat menghormati aturan Tata Letak Otomatis yang ditentukan oleh sel. Saya mengatur ukuran ke nilai arbitrer yang seharusnya cukup besar. Ukuran aktual akan dihitung kemudian oleh sistem Tata Letak Otomatis.
sumber
Saya lakukan dengan cara yang sedikit berbeda, Sebenarnya TableView saya ada di dalam scrollview jadi saya harus memberikan batasan ketinggian 0.
Kemudian pada saat runtime saya membuat perubahan berikut,
sumber
Sebagai perpanjangan dari jawaban Anooj VM, saya menyarankan yang berikut untuk me - refresh ukuran konten hanya ketika itu berubah.
Pendekatan ini juga menonaktifkan gulir dengan benar dan mendukung daftar dan rotasi yang lebih besar . Tidak perlu dispatch_async karena perubahan contentSize dikirim pada utas utama.
sumber
Versi objc dari Musa almatri
sumber
Anda dapat mencoba kebiasaan ini
AGTableView
Untuk Mengatur Kendala Ketinggian TableView Menggunakan storyboard atau secara terprogram. (Kelas ini secara otomatis mengambil batasan ketinggian dan mengatur tinggi tampilan konten ke tinggi tampilan Anda).
Catatan Jika ada masalah untuk mengatur Ketinggian lalu
yourTableView.layoutSubviews()
.sumber
Berdasarkan jawaban dari fl034 . Tetapi untuk pengguna Xamarin.iOS :
sumber
Implementasi Swift 5 saya adalah mengatur batasan hight dari tableView ke ukuran kontennya (
contentSize.height
). Metode ini mengasumsikan Anda menggunakan tata letak otomatis. Kode ini harus ditempatkan di dalamcellForRowAt
metode tableView.sumber
Jika Anda ingin tabel Anda menjadi dinamis, Anda harus menggunakan solusi berdasarkan konten tabel seperti yang dijelaskan di atas. Jika Anda hanya ingin menampilkan tabel yang lebih kecil, Anda dapat menggunakan tampilan kontainer dan menanamkan UITableViewController di dalamnya - UITableView akan diubah ukurannya sesuai dengan ukuran wadah.
Ini menghindari banyak perhitungan dan panggilan ke tata letak.
sumber
above
karena jawaban bisa dikocok.Solusi mu untuk ini dalam cepat 3 : Panggil metode ini masuk
viewDidAppear
sumber