tableHeaderView с Autolayout не работает правильно
Привет всем, у меня есть TableHeaderView, и все управляется Autolayout:
UIImageView
вверху всегда должно быть 2:1, поэтому я устанавливаю соотношение сторон и остальные необходимые ограничения.4
UIButtons
должен быть всегда горизонтальным и иметь одинаковую высоту и ширину. Так что я работал с равной шириной и равной высотой, а также с соотношением сторон 1:1А у меня два
UILabels
сnumberOfLines
установить на 0. Я также сделал подкласс моегоUILabel
из-заpreferredMaxLayoutWidth
, как это:- (void) layoutSubviews { [super layoutSubviews]; if ( self.numberOfLines == 0 ) { if ( self.preferredMaxLayoutWidth != self.frame.size.width ) { self.preferredMaxLayoutWidth = self.frame.size.width; [self setNeedsUpdateConstraints]; } } }
Это мой код:
- (void)initializeHeaderViewLabels
{
//After the Response from my server arrived i set the tableHeaderView with the Textdata
self.tableView.tableHeaderView = nil;
if((self.contentDict[@"title"]) != [NSNull null])
{
self.headerTitleLabel.text = (self.contentDict[@"title"]);
}
if((self.contentDict[@"shortDescription"]) != [NSNull null])
{
self.headerDescriptionLabel.text = (self.contentDict[@"shortDescription"]);
}
[self.headerView setNeedsLayout];
[self.headerView layoutIfNeeded];
CGFloat height = [self.headerView systemLayoutSizeFittingSize:UILayoutFittingCompressedSize].height;
CGRect headerFrame = self.headerView.frame;
headerFrame.size.height = height;
self.headerView.frame = headerFrame;
[self.tableView setTableHeaderView:self.headerView];
}
Я получаю свое изображение и текст для UILabels
с моего сервера, поэтому я должен ждать, пока не придет ответ, затем я звоню initializeHeaderViewLabels
,
** Моя проблема в том, что tableHeaderView слишком велик во время выполнения, и поэтому мои UILabels растягиваются и появляется много белого пространства. Может я что-то пропустил?
5 ответов
Чтобы это сработало, вам понадобится немного магии или вылететь из представления заголовка таблицы. Я уже ответил на аналогичный вопрос здесь. Хитрость заключается в магическом сбросе tableHeaderView
после оценки его высоты с помощью autolayout. Я создал пример проекта для этого: TableHeaderView + Autolayout.
Попробуйте приведенное ниже решение
- (void)sizeHeaderToFit
{
UIView *header = self.tableView.tableHeaderView;
[header setNeedsLayout];
[header layoutIfNeeded];
CGFloat height = [header systemLayoutSizeFittingSize:UILayoutFittingCompressedSize].height;
CGRect frame = header.frame;
frame.size.height = height;
header.frame = frame;
self.tableView.tableHeaderView = header;
}
Источник:
Также см. Ниже вопрос...!
Как установить высоту tableHeaderView (UITableView) с помощью автоматического размещения?
Моя проблема заключалась в том, что я устанавливал ограничения для моего представления заголовка, которые отображали некоторые значения кадра в значения кадра суперпредставления. Когда я снял ограничения и просто установил рамку напрямую, все заработало.
Высота представления заголовка задается в представлении таблицы. По умолчанию он имеет тот же размер, что и в построителе интерфейса, который слишком велик при запуске в приложении, поскольку ширина для построителя интерфейса составляет 600.
Так что вам нужно реализовать этот метод в UITableViewDelegate
func tableView(tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat {
return 200.0 // Set the desired height based on your device or what ever you are using.
}
И версия Objective-C:
- (CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section {
return 200.0f;
}
- (CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section
{
return 200;
}