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;
}

Источник:

Неправильная высота представления заголовка таблицы при использовании автоматического макета, IB и размеров шрифта

Также см. Ниже вопрос...!

Как установить высоту 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;
}
Другие вопросы по тегам