Я бив цим голову об стіну останні 3 чи 4 години, і, здається, не можу зрозуміти. У мене є UIViewController з повноекранним UITableView всередині нього (на екрані є деякі інші речі, ось чому я не можу використовувати UITableViewController), і я хочу отримати мій tableHeaderView для зміни розміру за допомогою авторозкладки. Само собою зрозуміло, це не співпраця.
Дивіться знімок екрана нижче.
Оскільки ярлик overviewLabel (наприклад, текст "Переглянути інформацію про огляд тут") має динамічний вміст, я використовую автоматичне розміщення, щоб змінити його розмір, і це суперперегляд. У мене все гарно змінюється, за винятком tableHeaderView, який знаходиться прямо під таблицею Paralax у 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, але жодна з них не є чіткою, і в підсумку мене це ще більше бентежить. Ось декілька:
Насправді немає сенсу змінювати властивість translatesAutoresizingMaskIntoConstraints на НІ, оскільки це просто спричиняє для мене помилки, і в будь-якому випадку не має сенсу концептуально.
Будь-яка допомога була б дуже вдячна!
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];
Редагувати 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. Проблема полягає в тому, що комірки перекриваються таблицеюHeaderView. Однак це працює на Xcode5