Я размахиваю своей головой о стену в течение последних 3 или 4 часов, и я не могу понять это. У меня есть UIViewController с полноэкранным UITableView внутри него (там некоторые другие вещи на экране, поэтому я не могу использовать UITableViewController), и я хочу, чтобы мой tableHeaderView изменил размер с автозапуском. Излишне говорить, что он не сотрудничает.
Смотрите снимок экрана ниже.
Поскольку обзорная заметка (например, текст "Обзор обзорной информации здесь." ) имеет динамический контент, я использую автозапуск, чтобы изменить его размер и контролировать. У меня есть все изменения размера, за исключением таблицыHeaderView, которая находится прямо под Paralax Table View в hiearchy.
Единственный способ, которым я нашел изменение размера заголовка, является программным, со следующим кодом:
CGRect headerFrame = self.headerView.frame;
headerFrame.size.height = headerFrameHeight;
self.headerView.frame = headerFrame;
[self.listTableView setTableHeaderView:self.headerView];
В этом случае headerFrameHeight представляет собой ручной расчет высоты таблицы TableHeader следующим образом (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 no overviewText, eliminate the padding in the overall height.
CGFloat headerFrameHeight = ceilf(startingY + overviewHeight + overviewPadding + 21.f + 10.f);
Ручной расчет работает, но он неуклюже и подвержен ошибкам, если в будущем ситуация изменится. То, что я хочу, чтобы иметь возможность сделать, - это сделать автоматическое изменение размера таблицыHeaderView на основе предоставленных ограничений, например, в любом другом месте. Но для жизни меня я не могу понять.
Там есть несколько сообщений об этом, но ни один из них не ясен и в конечном итоге запутывал меня больше. Вот несколько:
-
Можно ли использовать 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: Как отмечали другие, решение, опубликованное в редакторе 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;
}