Я воткнула головой о стену в течение последних 3 или 4 часов, и я не могу понять это. У меня есть UIViewController с полноэкранным UITableView внутри него (на экране есть что-то другое, поэтому я не могу использовать UITableViewController), и я хочу, чтобы мой tableHeaderView изменил размер с автозапуском. Излишне говорить, что он не сотрудничает.Как установить высоту таблицыHeaderView (UITableView) с автозапуском?
См. Снимок экрана ниже.
Поскольку overviewLabel (например, в «Список обзора информации здесь.» Текст) имеет динамическое содержание, я использую autolayout, чтобы изменить это, и это SuperView. У меня есть все изменения размера, за исключением таблицыHeaderView, которая находится прямо под 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);
ручного расчёта работы, но это неуклюжее и подвержен ошибкам, если ситуация не изменится в будущем. То, что я хочу, чтобы иметь возможность сделать, - это сделать автоматическое изменение размера таблицыHeaderView на основе предоставленных ограничений, например, в любом другом месте. Но для жизни я не могу понять.
В этом отношении есть несколько сообщений, но ни один из них не ясен и в конечном итоге запутывает меня больше. Вот некоторые из них:
Is it possible to use AutoLayout with UITableView's tableHeaderView?
table header view height is wrong when using auto layout, IB, and font sizes
Это действительно не Сенс e, чтобы изменить свойство translatesAutoresizingMaskIntoConstraints на NO, поскольку это просто вызывает ошибки для меня и не имеет смысла концептуально в любом случае.
Любая помощь действительно оценена!
EDIT 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];
Edit 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. Проблема в том, что ячейки перекрываются таблицейHeaderView. Однако он работает на Xcode5 –
@DawnSong действительно знает решение для Xcode6, чтобы я мог обновить ответ? –
После большого количества проб, я использую UITableViewCell вместо tableHeaderView, и он работает. –