ฉันทุบหัวกับกำแพงเป็นเวลา 3 หรือ 4 ชั่วโมงที่ผ่านมาและดูเหมือนจะคิดไม่ออก ฉันมี UIViewController ที่มี UITableView แบบเต็มหน้าจออยู่ข้างใน (มีบางสิ่งอื่น ๆ บนหน้าจอซึ่งเป็นสาเหตุที่ฉันไม่สามารถใช้ UITableViewController) และฉันต้องการให้ tableHeaderView ของฉันปรับขนาดด้วยการจัดวางอัตโนมัติ ไม่จำเป็นต้องพูดว่ามันไม่ร่วมมือ
ดูภาพหน้าจอด้านล่าง
เนื่องจากภาพรวมป้าย (เช่นข้อความ "แสดงข้อมูลภาพรวมที่นี่") มีเนื้อหาแบบไดนามิกฉันใช้การจัดวางอัตโนมัติเพื่อปรับขนาดและเป็น superview ฉันมีทุกอย่างที่ปรับขนาดได้ดียกเว้น tableHeaderView ซึ่งอยู่ด้านล่าง Paralax Table View ใน hiearchy
วิธีเดียวที่ฉันพบในการปรับขนาดมุมมองส่วนหัวนั้นเป็นแบบโปรแกรมโดยใช้รหัสต่อไปนี้:
CGRect headerFrame = self.headerView.frame;
headerFrame.size.height = headerFrameHeight;
self.headerView.frame = headerFrame;
[self.listTableView setTableHeaderView:self.headerView];
ในกรณีนี้ headerFrameHeight คือการคำนวณความสูง tableViewHeader ด้วยตนเองดังนี้(innerHeaderView คือพื้นที่สีขาวหรือ "View" อันที่สอง headerView คือ 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);
การคำนวณด้วยตนเองใช้งานได้ แต่จะไม่สะดวกและมีแนวโน้มที่จะเกิดข้อผิดพลาดหากมีการเปลี่ยนแปลงในอนาคต สิ่งที่ฉันต้องการทำได้คือให้ tableHeaderView ปรับขนาดอัตโนมัติตามข้อ จำกัด ที่มีให้เช่นเดียวกับที่คุณสามารถทำได้ทุกที่ แต่สำหรับชีวิตของฉันฉันคิดไม่ออก
มีหลายโพสต์เกี่ยวกับ SO เกี่ยวกับเรื่องนี้ แต่ไม่มีอะไรชัดเจนและทำให้ฉันสับสนมากขึ้น นี่คือบางส่วน:
เป็นไปได้ไหมที่จะใช้ AutoLayout กับ tableHeaderView ของ UITableView
ความสูงของมุมมองส่วนหัวของตารางไม่ถูกต้องเมื่อใช้รูปแบบอัตโนมัติ IB และขนาดตัวอักษร
มันไม่สมเหตุสมผลเลยที่จะเปลี่ยนคุณสมบัติ translatesAutoresizingMaskIntoConstraints เป็น NO เนื่องจากนั่นทำให้เกิดข้อผิดพลาดสำหรับฉันและไม่สมเหตุสมผลในแนวความคิด
ความช่วยเหลือใด ๆ ที่จะได้รับการชื่นชมจริงๆ!
แก้ไข 1: ขอบคุณคำแนะนำของ TomSwift ทำให้ฉันเข้าใจได้ แทนที่จะคำนวณความสูงของภาพรวมด้วยตนเองฉันสามารถคำนวณให้ฉันได้ดังนี้แล้วตั้งค่า tableHeaderView ใหม่เหมือนเดิม
[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];
แก้ไข 2:ตามที่คนอื่น ๆ สังเกตเห็นว่าโซลูชันที่โพสต์ใน Edit 1 ดูเหมือนจะไม่ทำงานใน viewDidLoad อย่างไรก็ตามดูเหมือนว่าจะทำงานใน viewWillLayoutSubviews ตัวอย่างโค้ดด้านล่าง:
// 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
ไม่ทำงานบน Xcode6 ปัญหาคือเซลล์ที่ซ้อนทับกันโดย tableHeaderView อย่างไรก็ตามมันใช้ได้กับ Xcode5