Karena saya menemukan AutoLayout
saya menggunakannya di mana-mana, sekarang saya mencoba menggunakannya dengan file tableHeaderView
.
Saya membuat subclass
dari UIView
menambahkan semua (label dll ...) yang saya inginkan dengan batasan mereka, lalu saya menambahkan ini CustomView
ke UITableView
' tableHeaderView
.
Semuanya bekerja dengan baik kecuali UITableView
selalu menampilkan atas yang CustomView
, oleh di atas saya maksud CustomView
adalah di bawah ini UITableView
sehingga tidak bisa dilihat!
Tampaknya tidak peduli apa yang saya lakukan, height
dari UITableView
' tableHeaderView
adalah selalu 0 (jadi adalah lebar, x dan y).
Pertanyaan saya: apakah mungkin untuk mencapai hal ini tanpa menyetel frame secara manual ?
EDIT:
The CustomView
' subview
yang saya gunakan memiliki kendala ini:
_title = [[UILabel alloc]init];
_title.text = @"Title";
[self addSubview:_title];
[_title keep:[KeepTopInset rules:@[[KeepEqual must:5]]]]; // title has to stay at least 5 away from the supperview Top
[_title keep:[KeepRightInset rules:@[[KeepMin must:5]]]];
[_title keep:[KeepLeftInset rules:@[[KeepMin must:5]]]];
[_title keep:[KeepBottomInset rules:@[[KeepMin must:5]]]];
Saya menggunakan pustaka praktis 'KeepLayout' karena menulis batasan secara manual membutuhkan waktu yang lama dan terlalu banyak baris untuk satu batasan tunggal tetapi metodenya menjelaskan sendiri.
Dan UITableView
memiliki batasan ini:
_tableView = [[UITableView alloc]init];
_tableView.translatesAutoresizingMaskIntoConstraints = NO;
_tableView.delegate = self;
_tableView.dataSource = self;
_tableView.backgroundColor = [UIColor clearColor];
[self.view addSubview:_tableView];
[_tableView keep:[KeepTopInset rules:@[[KeepEqual must:0]]]];// These 4 constraints make the UITableView stays 0 away from the superview top left right and bottom.
[_tableView keep:[KeepLeftInset rules:@[[KeepEqual must:0]]]];
[_tableView keep:[KeepRightInset rules:@[[KeepEqual must:0]]]];
[_tableView keep:[KeepBottomInset rules:@[[KeepEqual must:0]]]];
_detailsView = [[CustomView alloc]init];
_tableView.tableHeaderView = _detailsView;
Saya tidak tahu apakah saya harus mengatur beberapa batasan secara langsung CustomView
, menurut saya ketinggian CustomView ditentukan oleh batasan pada UILabel
"judul" di dalamnya.
EDIT 2: Setelah penyelidikan lain, tampaknya tinggi dan lebar CustomView dihitung dengan benar, tetapi bagian atas CustomView masih berada di level yang sama dengan bagian atas UITableView dan mereka bergerak bersamaan saat saya menggulir.
sumber
Jawaban:
Saya bertanya dan menjawab pertanyaan serupa di sini . Singkatnya, saya menambahkan tajuk sekali dan menggunakannya untuk menemukan ketinggian yang diperlukan. Ketinggian itu kemudian dapat diterapkan ke tajuk, dan tajuk disetel untuk kedua kalinya untuk mencerminkan perubahan.
Jika Anda memiliki label multi-baris, ini juga bergantung pada tampilan kustom yang menyetel preferMaxLayoutWidth dari setiap label:
atau mungkin lebih umum:
Perbarui Januari 2015
Sayangnya ini sepertinya masih perlu. Berikut ini versi cepat dari proses tata letak:
Saya merasa berguna untuk memindahkan ini ke dalam ekstensi di UITableView:
Pemakaian:
sumber
preferredMaxLayoutWidth
adalah menambahkan batasan lebar (sama dengan lebar tampilan tabel) pada tampilan header sebelum menggunakansystemLayoutSizeFittingSize:
.self.tableView.tableHeaderView
let height = header.systemLayoutSizeFittingSize(CGSizeMake(CGRectGetWidth(self.bounds), 0), withHorizontalFittingPriority: UILayoutPriorityRequired, verticalFittingPriority: UILayoutPriorityFittingSizeLevel).height
header.setNeedsLayout() header.layoutIfNeeded() header.frame.size = header.systemLayoutSizeFitting(UILayoutFittingCompressedSize) self.tableHeaderView = header
akan berfungsi di iOS 10.2Saya tidak dapat menambahkan tampilan header menggunakan batasan (dalam kode). Jika saya memberikan batasan lebar dan / atau tinggi pada pandangan saya, saya mengalami error dengan pesan yang mengatakan:
Saat saya menambahkan tampilan di storyboard ke tampilan tabel saya, itu tidak menunjukkan kendala, dan berfungsi dengan baik sebagai tampilan header, jadi menurut saya penempatan tampilan header tidak dilakukan dengan menggunakan batasan. Tampaknya tidak berperilaku seperti pandangan normal dalam hal itu.
Lebar secara otomatis menjadi lebar tampilan tabel, satu-satunya hal yang perlu Anda setel adalah tingginya - nilai asal diabaikan, jadi tidak masalah apa yang Anda masukkan untuk itu. Misalnya, ini berfungsi dengan baik (seperti halnya 0,0,0,80 untuk rect):
sumber
translatesAutoresizingMaskIntoConstraints = NO
. Mengaktifkan terjemahan mencegah kesalahan - Saya curigaUITableView
mulai 7.1 tidak mencoba mengatur tampilan tajuknya secara otomatis dan menginginkan sesuatu dengan bingkai yang telah ditentukan sebelumnya.Saya melihat banyak metode di sini melakukan begitu banyak hal yang tidak perlu, tetapi Anda tidak perlu terlalu banyak menggunakan tata letak otomatis di tampilan tajuk. Anda hanya perlu membuat file xib, meletakkan batasan Anda dan membuatnya seperti ini:
sumber
Solusi lain adalah mengirimkan pembuatan tampilan header ke panggilan utas utama berikutnya:
Catatan: Ini memperbaiki bug saat tampilan yang dimuat memiliki ketinggian tetap. Saya belum pernah mencoba ketika tinggi header hanya bergantung pada isinya.
EDIT:
Anda dapat menemukan solusi yang lebih bersih untuk masalah ini dengan mengimplementasikan fungsi ini , dan memanggilnya
viewDidLayoutSubviews
sumber
tableHeaderView
agak bermasalah dengan autolayout. Ada beberapa solusi, seperti ini. Tapi karena saya menulis ini, saya telah menemukan yang lebih baik dan lebih bersih solusi di sini stackoverflow.com/a/21099430/127493 dengan memanggil- (void)sizeHeaderToFit
diviewDidLayoutSubviews
Kode:
sumber
Perluas solusi ini http://collindonnell.com/2015/09/29/dynamically-sized-table-view-header-or-footer-using-auto-layout/ untuk tampilan footer tabel:
sumber
self.tableFooterView.transform
bagiannya? Mengapa itu perlu?Anda bisa mendapatkan autolayout untuk memberi Anda ukuran dengan menggunakan metode systemLayoutSizeFittingSize .
Anda kemudian dapat menggunakan ini untuk membuat bingkai untuk aplikasi Anda. Teknik ini berfungsi kapan pun Anda perlu mengetahui ukuran tampilan yang menggunakan tata letak otomatis secara internal.
Kode dengan cepat terlihat seperti
Atau di Objective-C
Perlu juga diperhatikan bahwa dalam contoh khusus ini, mengganti requireConstraintBasedLayout di subkelas Anda, memang menghasilkan pemasangan tata letak, namun hasil dari pemasangan tata letak ini diabaikan dan frame sistem disetel ke lebar tableView dan tinggi 0.
sumber
Berikut ini berhasil untuk saya.
UIView
sebagai tampilan header.UIView
Manfaat utama yang saya lihat adalah membatasi kalkulasi bingkai. Apple harus benar-benar memperbarui
UITableView
API untuk membuatnya lebih mudah.Contoh menggunakan SnapKit:
sumber
Hal-hal aneh terjadi. systemLayoutSizeFittingSize berfungsi sangat baik untuk iOS9, tetapi tidak untuk iOS 8 dalam kasus saya. Jadi masalah ini diselesaikan dengan cukup mudah. Cukup dapatkan tautan ke tampilan bawah di header dan di viewDidLayoutSubviews setelah batas tampilan header pembaruan panggilan super dengan memasukkan tinggi sebagai CGRectGetMaxY (yourview.frame) + padding
UPD: Solusi termudah yang pernah ada : Jadi, dalam tampilan header tempatkan subview dan sematkan ke kiri , kanan , atas . Di subview itu, tempatkan subview Anda dengan batasan ketinggian otomatis. Setelah itu serahkan semua pekerjaan ke autolayout (tidak perlu perhitungan)
Akibatnya subview meluas / menyusut seperti seharusnya, pada akhirnya subview memanggil viewDidLayoutSubviews. Pada saat kami mengetahui ukuran sebenarnya dari tampilan, jadi setel tinggi headerView dan perbarui dengan menetapkan ulang. Bekerja seperti pesona!
Juga berfungsi untuk tampilan footer.
sumber
Diperbarui untuk Swift 4.2
sumber
Anda dapat menambahkan batasan lokasi atas + horizontal antara header dan tableview, untuk menempatkannya, dengan benar (jika header itu sendiri berisi semua batasan tata letak internal yang diperlukan untuk memiliki bingkai yang benar)
dalam metode viewDidLoad tableViewController
sumber
Tampilan header tabel saya adalah subclass UIView - Saya membuat UIView contentView tunggal di dalam penginisialisasi, dengan batasannya sama dengan bingkai tampilan header tabel dan menambahkan semua objek saya sebagai subview dari itu.
Kemudian tambahkan batasan untuk objek Anda dalam
layoutSubviews
metode tampilan header tabel daripada dalam penginisialisasi. Itu memecahkan kecelakaan itu.sumber
AutoLayout saya bekerja dengan sangat baik:
sumber
Untuk kebanyakan kasus, solusi terbaik adalah tidak melawan framework dan menggunakan masker autoresizing:
Dengan menggunakan autoresizing masks, Anda memberi tahu framework bagaimana tampilan Anda harus mengubah ukurannya saat superview mengubah ukurannya. Tetapi perubahan ini didasarkan pada bingkai awal yang Anda tetapkan.
sumber
Saya tahu ini adalah posting lama tetapi Setelah melalui semua posting SO tentang ini dan melewati sepanjang sore bermain dengan ini, saya akhirnya menemukan solusi yang bersih namun sangat sederhana
Pertama-tama, hierarki tampilan saya terlihat seperti ini:
tableHeaderView
Sekarang di dalam View (No.3), saya mengatur semua batasan seperti biasanya termasuk ruang bawah ke container. Ini akan membuat wadah (yaitu 3. Tampilan yaitu headerView) untuk mengukur dirinya sendiri berdasarkan subview dan batasannya.
Setelah itu, saya menetapkan batasan antara
3. View
dan2. View
untuk ini:Perhatikan bahwa saya sengaja menghilangkan ruang bawah.
Setelah semua ini selesai di papan cerita, yang perlu dilakukan adalah menempelkan tiga baris kode tersebut:
sumber
Tips: Jika Anda menggunakan metode setAndLayoutTableHeaderView, Anda harus mengupdate frame subview, jadi dalam situasi ini, preferMaxLayoutWidth UILabel harus memanggil sebelum systemLayoutSizeFittingSize dipanggil, jangan panggil layoutSubview.
kode acara
sumber
Bagikan pendekatan saya.
UITableView+XXXAdditions.m
Pemakaian.
sumber
Dalam metode kasus saya dengan systemLayoutSizeFittingSize karena alasan tertentu tidak berfungsi. Apa yang berhasil untuk saya adalah modifikasi solusi yang diposting oleh HotJard (dia solusi asli juga tidak berfungsi dalam kasus saya di iOS 8). Yang perlu saya lakukan adalah di tampilan header, tempatkan subview dan pin ke kiri, kanan, atas (jangan sematkan ke bawah). Letakkan semuanya menggunakan autolayout di subview itu dan di kode lakukan ini:
sumber
Posting lama. Tapi postingan yang bagus. Ini 2 sen saya.
Pertama, pastikan bahwa tampilan header Anda memiliki batasan yang diatur sehingga dapat mendukung ukuran konten intrinsiknya sendiri. Kemudian lakukan hal berikut.
sumber
Saya bisa mencapainya dengan pendekatan berikut (ini berfungsi untuk footer dengan cara yang sama).
Pertama, Anda memerlukan
UITableView
ekstensi kecil :Cepat 3
Dalam implementasi kelas pengontrol tampilan Anda:
Catatan tentang
UIView
implementasi subview header :Anda harus 100% yakin bahwa tampilan header Anda memiliki pengaturan tata letak otomatis yang benar. Saya akan merekomendasikan untuk memulai dengan tampilan tajuk sederhana hanya dengan satu kendala tinggi dan mencoba penyiapan di atas.
Timpa
requiresConstraintBasedLayout
dan kembalikantrue
:.
sumber
Untuk pengguna Xamarin:
Dengan asumsi Anda menamai tampilan header dari tampilan tabel Anda sebagai TableviewHeader
sumber
Inilah cara Anda melakukannya
UIViewController
sumber
Apa pun yang berbasis kendala
UIView
bisa menjadi bagustableHeaderView
.Seseorang perlu menyetel
tableFooterView
sebelum dan kemudian memberlakukan batasan tambahan tambahan padatableFooterView
dantableHeaderView
.}
Semua detail dan cuplikan kode dapat ditemukan di sini
sumber
Saya telah menemukan solusinya. bungkus tampilan autolayout wrriten xib header Anda dalam pembungkus uiview kosong, dan tetapkan tampilan header ke properti tableViewHeader tableView.
sumber
Inilah yang berfungsi untuk UITableViewController di ios 12,
Drap UIView ke TableView di atas semua sel prototipe untuk header dan di bawah semua sel prototipe untuk footer. Siapkan header dan footer Anda sesuai kebutuhan. Tetapkan semua batasan yang diperlukan.
Sekarang gunakan metode ekstensi berikut
dan menyebutnya dalam ViewDidLayoutSubviews dari subclass UITableViewController
sumber
Saya mengalami masalah untuk mendapatkan lebar 375pt, satu-satunya cara yang berhasil bagi saya adalah menyampaikan tableView untuk mendapatkan lebar yang benar. Saya juga lebih suka AutoLayout daripada mengatur Ukuran bingkai.
Ini versi yang cocok untuk saya:
Xamarin.iOS
Versi Swift (dimodifikasi dari jawaban @Ben Packard)
sumber
Saya membuat subkelas
UITableView
dan digunakanUIStackView
untuk header dan footer, ini juga memungkinkan pengaturan lebih dari satu tampilan.https://github.com/omaralbeik/StackableTableView
sumber
Solusi saya adalah membuat kelas baru seperti ini.
Untuk menggunakannya, cukup tambahkan semua subview Anda ke sebuah instance
BaseTableHeaderView
dan lampirkan ke tampilan tabel Anda.Ini akan secara otomatis mengubah ukuran berdasarkan batasannya.
sumber
Jawaban yang diterima hanya berguna untuk tabel dengan satu bagian. Untuk multi-bagian,
UITableView
pastikan header Anda diwarisi dariUITableViewHeaderFooterView
dan Anda akan baik-baik saja.Sebagai alternatif, hanya menanamkan header saat ini dalam
contentView
sebuahUITableViewHeaderFooterView
. Persis sepertiUITableViewCell
karya.sumber
tableHeaderView
bukan tentang header bagian.