我在過去的3或4個小時裏一直在用這種方式將我的頭撞在牆上,我似乎無法弄清楚。我有一個UIViewController裏面有一個全屏UITableView(屏幕上還有一些其他的東西,這就是爲什麼我不能使用UITableViewController),我想讓我的tableHeaderView通過自動佈局調整大小。不用說,這不合作。如何使用自動佈局設置tableHeaderView(UITableView)的高度?
查看下面的截圖。
因爲overviewLabel(例如,「在這裏列出的概述信息。」文)的動態內容,我使用的自動佈局調整它的大小和它的上海華。我已經調整好了所有的東西,除了tableHeaderView,它恰好位於hiearchy中的Paralax Table View之下。
我發現來調整該標題視圖的唯一方法是編程,用下面的代碼:
CGRect headerFrame = self.headerView.frame;
headerFrame.size.height = headerFrameHeight;
self.headerView.frame = headerFrame;
[self.listTableView setTableHeaderView:self.headerView];
在這種情況下,headerFrameHeight是tableViewHeader高度的手工計算如下(innerHeaderView是白色區域,或第二「查看」,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根據提供的約束條件自動調整大小,就像你可以在任何地方一樣。但對於我的生活,我無法弄清楚。
對此,有幾篇關於這方面的文章,但沒有一篇很清楚,最終讓我更困惑。這裏有幾個:
Is it possible to use AutoLayout with UITableView's tableHeaderView?
table header view height is wrong when using auto layout, IB, and font sizes
它並沒有真正做SENS e將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:正如其他人所指出的,張貼在編輯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上工作 –
@DawnSong知道Xcode6的解決方案,以便我可以更新答案? –
經過大量試用後,我使用UITableViewCell而不是tableHeaderView,它可以工作。 –