Saya telah membenturkan kepala saya ke dinding dengan ini selama 3 atau 4 jam terakhir dan sepertinya saya tidak bisa memahaminya. Saya memiliki UIViewController dengan UITableView layar penuh di dalamnya (ada beberapa hal lain di layar, itulah sebabnya saya tidak dapat menggunakan UITableViewController) dan saya ingin tableHeaderView saya diubah ukurannya dengan autolayout. Tak perlu dikatakan, itu tidak bekerja sama.
Lihat gambar di bawah.
Karena label overview (mis. Teks "Cantumkan informasi ikhtisar di sini.") Memiliki konten dinamis, saya menggunakan autolayout untuk mengubah ukurannya dan ini adalah tampilan super. Saya telah mengubah ukurannya dengan baik, kecuali untuk tableHeaderView, yang berada tepat di bawah Paralax Table View di hiearchy.
Satu-satunya cara yang saya temukan untuk mengubah ukuran tampilan header itu secara terprogram, dengan kode berikut:
CGRect headerFrame = self.headerView.frame;
headerFrame.size.height = headerFrameHeight;
self.headerView.frame = headerFrame;
[self.listTableView setTableHeaderView:self.headerView];
Dalam kasus ini, headerFrameHeight adalah kalkulasi manual dari tinggi tableViewHeader sebagai berikut (innerHeaderView adalah area putih, atau "View" kedua, headerView adalah tableHeaderView) :
CGFloat startingY = self.innerHeaderView.frame.origin.y + self.overviewLabel.frame.origin.y;
CGRect overviewSize = [self.overviewLabel.text
boundingRectWithSize:CGSizeMake(290.f, CGFLOAT_MAX)
options:NSStringDrawingUsesLineFragmentOrigin
attributes:@{NSFontAttributeName: self.overviewLabel.font}
context:nil];
CGFloat overviewHeight = overviewSize.size.height;
CGFloat overviewPadding = ([self.overviewLabel.text length] > 0) ? 10 : 0; // If there's no overviewText, eliminate the padding in the overall height.
CGFloat headerFrameHeight = ceilf(startingY + overviewHeight + overviewPadding + 21.f + 10.f);
Penghitungan manual berfungsi, tetapi kikuk dan rawan kesalahan jika ada perubahan di masa mendatang. Apa yang ingin saya lakukan adalah mengubah ukuran otomatis tableHeaderView berdasarkan batasan yang disediakan, seperti yang Anda bisa lakukan di tempat lain. Tapi untuk hidupku, aku tidak bisa memahaminya.
Ada beberapa posting di SO tentang ini, tetapi tidak ada yang jelas dan akhirnya lebih membingungkan saya. Ini beberapa:
Apakah mungkin menggunakan AutoLayout dengan tableHeaderView milik UITableView?
tinggi tampilan header tabel salah saat menggunakan tata letak otomatis, IB, dan ukuran font
Tidaklah masuk akal untuk mengubah properti translatesAutoresizingMaskIntoConstraints menjadi NO, karena hal itu hanya menyebabkan kesalahan bagi saya dan tidak masuk akal secara konseptual.
Bantuan apapun akan sangat dihargai!
EDIT 1: Berkat saran TomSwift, saya dapat mengetahuinya. Alih-alih menghitung secara manual ketinggian ikhtisar, saya dapat menghitungnya untuk saya sebagai berikut dan kemudian mengatur ulang tableHeaderView seperti sebelumnya.
[self.headerView setNeedsLayout];
[self.headerView layoutIfNeeded];
CGFloat height = [self.innerHeaderView systemLayoutSizeFittingSize:UILayoutFittingCompressedSize].height + self.innerHeaderView.frame.origin.y; // adding the origin because innerHeaderView starts partway down headerView.
CGRect headerFrame = self.headerView.frame;
headerFrame.size.height = height;
self.headerView.frame = headerFrame;
[self.listTableView setTableHeaderView:self.headerView];
Sunting 2: Seperti yang telah dicatat orang lain, solusi yang diposting di Sunting 1 tampaknya tidak berfungsi di viewDidLoad. Namun, tampaknya berfungsi di viewWillLayoutSubviews. Contoh kode di bawah ini:
// Note 1: The variable names below don't match the variables above - this is intended to be a simplified "final" answer.
// Note 2: _headerView was previously assigned to tableViewHeader (in loadView in my case since I now do everything programatically).
// Note 3: autoLayout code can be setup programatically in updateViewConstraints.
- (void)viewWillLayoutSubviews {
[super viewWillLayoutSubviews];
[_headerWrapper setNeedsLayout];
[_headerWrapper layoutIfNeeded];
CGFloat height = [_headerWrapper systemLayoutSizeFittingSize:UILayoutFittingCompressedSize].height;
CGRect headerFrame = _headerWrapper.frame;
headerFrame.size.height = height;
_headerWrapper.frame = headerFrame;
_tableView.tableHeaderView = _headerWrapper;
}
setTableHeaderView
tidak berfungsi di Xcode6. Masalahnya adalah sel-sel tersebut tumpang tindih dengan tableHeaderView. Namun, ini berfungsi pada Xcode5