Apakah mungkin untuk mendapatkan tinggi header bagian tampilan tabel dinamis menggunakan Tata Letak Otomatis?

112

Baru di iOS 8, Anda bisa mendapatkan 100% sel tampilan tabel dinamis hanya dengan mengatur perkiraan tinggi baris, lalu tata letak elemen Anda di sel menggunakan Tata Letak Otomatis. Jika konten bertambah tinggi, sel juga akan bertambah tinggi. Ini sangat berguna, dan saya bertanya-tanya apakah prestasi yang sama dapat dicapai untuk header bagian dalam tampilan tabel?

Dapatkah seseorang, misalnya, membuat UIViewmasuk tableView:viewForHeaderInSection:, menambahkan UILabelsubview, menentukan batasan tata letak otomatis untuk label terhadap tampilan, dan meningkatkan tinggi tampilan agar sesuai dengan konten label, tanpa harus menerapkan tableView:heightForHeaderInSection:?

Dokumentasi untuk viewForHeaderInSectionstatus: "Metode ini hanya berfungsi dengan benar jika tableView: heightForHeaderInSection: juga diimplementasikan." Saya belum mendengar apakah ada yang berubah untuk iOS 8.

Jika seseorang tidak dapat melakukan itu, apa cara terbaik untuk meniru perilaku ini?

Jordan H
sumber

Jawaban:

275

Ini mungkin. Ini baru tepat di samping ketinggian sel dinamis yang diterapkan di iOS 8.

Sangat sederhana. Tambahkan ini di viewDidLoad:

self.tableView.sectionHeaderHeight = UITableViewAutomaticDimension;
self.tableView.estimatedSectionHeaderHeight = 25;

Kemudian timpa viewForHeaderInSectiondan gunakan Tata Letak Otomatis untuk membatasi elemen dalam tampilan Anda sesuai keinginan. Itu dia! Tidak perlu diimplementasikan heightForHeaderInSection. Dan sebenarnyasectionHeaderHeight tidak perlu juga disebutkan, saya tambahkan saja untuk kejelasan.

Perhatikan bahwa di iOS 11, tampilan sel dan header / footer menggunakan perkiraan ketinggian secara default. Satu-satunya hal yang harus dilakukan adalah memberikan perkiraan ketinggian untuk lebih menginformasikan sistem apa yang diharapkan. Nilai defaultnya adalah UITableViewAutomaticDimensiontetapi Anda harus memberikan perkiraan yang lebih baik yaitu tinggi rata-rata jika memungkinkan.

Jordan H
sumber
3
Itu keren jika berhasil, tetapi dokumen tidak menyebutkannya, dan begitu pula sesi WWDC jika saya ingat dengan benar. Dokumen untuk UITableViewAutomaticDimensionmengatakan "jika Anda mengembalikan konstanta ini dalam tableView:heightForHeaderInSection:atau tableView:heightForFooterInSection:, UITableViewmenggunakan ketinggian yang sesuai dengan nilai yang dikembalikan dari tableView:titleForHeaderInSection:atau tableView:titleForFooterInSection:(jika judulnya tidak nil)."
Aaron Brager
28
Ini tidak berhasil untuk saya. Tajuk bagian saya dapat menghitung tinggi secara otomatis, tetapi tumpang tindih dengan sel di bagian tersebut. Saya menyiapkan tampilan tajuk saya menggunakan file xib dan menyetel batasan saya di pembuat antarmuka. Apakah itu masalah saya? Di mana kalian membuat kendala? Terima kasih!
CoBrA2168
5
Seperti yang dijanjikan di sini adalah contoh kode: github.com/ebetabox/DynamicCellSectionHeight
PakitoV
10
Poin penting lainnya di sini, sel tabel Anda juga perlu dikonfigurasi untuk penghitungan ketinggian otomatis (UITableViewAutomaticDimension) agar berfungsi pada bagian.
Bob Spryn
9
Anda harus memiliki estimatedSectionHeaderHeightatau tableView:estimatedHeightForHeaderInSection:DAN sectionHeaderHeightatau tableView:heightForHeaderInSection:. Selain itu, jika Anda menggunakan metode delegasi, Anda harus mengembalikan nilai yang lebih besar dari 1,00 untuk perkiraan (perilaku yang benar-benar tidak terdokumentasi), jika tidak, delegasi untuk tinggi TIDAK akan dipanggil dan tinggi header tampilan tabel default akan digunakan.
Vadoff
29

Ini dapat dilakukan dengan mengatur (atau mengembalikan) estimatedSectionHeaderHeightpada tampilan tabel Anda.

Jika tajuk bagian Anda tumpang tindih dengan sel Anda setelah pengaturanestimatedSectionHeaderHeight , pastikan Anda menggunakan estimatedRowHeightjuga.

(Saya menambahkan jawaban ini karena paragraf kedua berisi jawaban untuk masalah yang dapat ditemukan setelah membaca semua komentar yang mungkin terlewatkan oleh sebagian orang.)

Clay Ellis
sumber
1
Terima kasih, setelah mengatur estimatedRowHeightini berfungsi seperti pesona :)
sz ashik
1
Ini benar meskipun Anda TIDAK menggunakan UITableViewAutomaticDimension untuk baris. Terima kasih telah menyelamatkan saya satu jam.
Ryan Romanchuk
14

Terjebak dalam masalah yang sama di mana tajuk mendapatkan ketinggian nol hingga dan kecuali saya memberikan ketinggian tetap pada delegasi untuk heighForHeaderInSection .

Mencoba banyak solusi yang termasuk

self.tableView.sectionHeaderHeight = UITableView.automaticDimension
self.tableView.estimatedSectionHeaderHeight = 73

Tapi tidak ada yang berhasil. Ponsel saya juga menggunakan tata letak otomatis yang benar. Baris mengubah tinggi mereka secara dinamis dengan menggunakan kode berikut tetapi tajuk bagian tidak.

self.tableView.estimatedRowHeight = 135
self.tableView.rowHeight = UITableView.automaticDimension

Perbaikannya juga sangat sederhana dan aneh tetapi saya harus menerapkan metode delegasi alih-alih kode 1 baris untuk estimatedSectionHeaderHeightdan sectionHeaderHeightyang berlaku sebagai berikut untuk kasus saya.

func tableView(_ tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat {
    UITableView.automaticDimension
}

func tableView(_ tableView: UITableView, estimatedHeightForHeaderInSection section: Int) -> CGFloat {
    73
}
Ahsan Ebrahim
sumber
11

Cepat 4+

bekerja (Diuji 100%)

Jika Anda membutuhkan kedua bagian serta baris dengan ketinggian dinamis berdasarkan konten maka Anda dapat menggunakan kode di bawah ini:

Di viewDidLoad () tulis baris ini:

    self.globalTableView.estimatedRowHeight = 20
    self.globalTableView.rowHeight = UITableView.automaticDimension

    self.globalTableView.sectionHeaderHeight =  UITableView.automaticDimension
    self.globalTableView.estimatedSectionHeaderHeight = 25;

Sekarang kita telah mengatur tinggi baris dan tinggi bagian dengan menggunakan metode UITableView Delegate:

func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat
   {
       return UITableView.automaticDimension
   }
   func tableView(_ tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat {

       return UITableView.automaticDimension

   }
Tuan Javed Multani
sumber
CATATAN untuk jawaban yang bagus ini. Pada tahun 2020 tampaknya tidak masalah untuk HANYA menggunakan empat properti di viewDidLoad.
Fattie
CATATAN untuk jawaban yang bagus ini. Pada tahun 2020 Anda DO membutuhkan dua garis "tidak berguna" yang memberikan perkiraan ketinggian (katakanlah, 20 atau lebih).
Fattie
6

Saya mencoba

self.tableView.sectionHeaderHeight = UITableViewAutomaticDimension;
self.tableView.estimatedSectionHeaderHeight = 25;

tetapi ukurannya tidak tepat untuk header dengan label multiline. Menambahkan ini untuk menyelesaikan masalah saya:

override func viewWillAppear(_ animated: Bool) {
    super.viewWillAppear(animated)

    // Recalculates height
    tableView.beginUpdates()
    tableView.endUpdates()
}
iuriimoz
sumber
lakukan definisi fungsi sumber data tableView:estimatedHeightForHeaderInSectiondan tableView:heightForHeaderInSectionbukannya menentukan di viewDidLoad.
Keith Yeoh
Saya menemukan pengaturan estimatedSectionHeaderHeighthanya diperlukan di bawah iOS 11
doctorBroctor
1

Dalam kasus saya:

  1. set secara terprogram tidak berfungsi .

self.tableView.sectionHeaderHeight = UITableViewAutomaticDimension.

  1. diatur di storyboard tidak berfungsi .

  2. override heightForHeaderInSection berhasil .

override func tableView(_ tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat {
    return UITableViewAutomaticDimension
}

uji lingkungan:

  • Mac OS 10.13.4
  • XCode Versi 9.4.1
  • Simulator iPhone 8 Plus
Codus
sumber
0

Ya, itu berhasil untuk saya. Saya harus membuat lebih banyak perubahan seperti di bawah ini:

override func tableView(_ tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? {
    let label = UILabel()

    label.numberOfLines = 0
    label.text          = my own text

    return label
}
arg_vn
sumber
-2

Saya mengubah jawaban iuriimoz . Baru saja mengganti metode viewWillAppear:

tableView.sectionHeaderHeight = UITableViewAutomaticDimension
tableView.estimatedSectionHeaderHeight = 25


override func viewWillAppear(_ animated: Bool) {
    super.viewWillAppear(animated)

    // Recalculates height
    tableView.layoutIfNeeded() 
}

Tambahkan juga tableView.layoutIfNeeded () ke

override func viewDidAppear(_ animated: Bool) {

    super.viewDidAppear(animated)
    tableView.layoutIfNeeded()
}

Untuk iOS 10

tableView.beginUpdates()
tableView.endUpdates()

beri efek animasi "memudar" di viewWillAppear untuk saya

Irina
sumber