Автоматическая компоновка для tableHeaderView

Я пытаюсь улучшить свои макеты, изучая Auto Layout, но я наткнулся на проблему, которую я просто не смог решить.

Вот что происходит: есть контроллер вида, содержащий, помимо прочего, UITableView и a UIView. Это представление расположено чуть ниже табличного вида, и его высота не распространяется на высоту всего экрана (пусть он занимает верхнюю половину).

В представлении таблицы с использованием сгруппированного стиля и размещенной чуть выше упомянутого представления есть полупрозрачный фон, чтобы вы могли видеть содержимое представления чуть ниже. Так как представление занимает половину экрана, мне нужно добавить tableHeaderView (также полупрозрачный) в этот вид таблицы, чтобы весь фоновый контент был четко виден при первой загрузке контроллера вида.

Окончательный эффект этого будет похож на фиксированный tableHeaderView, который исчезает на фоне при прокрутке табличного представления.

Это делается простым способом, используя springs и struts, но Auto Layout сбрасывает приложение каждый раз, когда я пытаюсь добавить заголовок в представление таблицы (независимо от того, как я это делаю).

Поскольку я ищу способ всегда соответствовать высоте представления в фоновом режиме (otherView) с высотой tableHeaderView, я использую:

[self.view addConstraint:[NSLayoutConstraints constraintWithItem:headerView attribute:NSLayoutAttributeHeight relatedBy:NSLayoutRelationEqual toItem:otherView attribute:NSLayoutAttributeHeight multiplier: 1 constant:0]];

(я понимаю, что ограничение не может быть добавлено непосредственно в представление таблицы, так как otherView не является его дочерним элементом)

а также:

[headerView setTranslatesAutoResizingMaskIntoConstraints:NO]

Эти вызовы всегда приводят к этому сбою:

*** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'Auto Layout still required after executing -layoutSubviews. UITableView implementation of -layoutSubviews needs to call super.'

Так есть ли способ сделать это? Возможно ли связать высоту tableHeaderView с другим элементом в представлении с помощью Auto Layout?

Я также должен отметить, что я давно отошел от IB, поэтому все это делается исключительно в коде, в частности, на loadView.

Ответ 1

Если вы создаете переменную экземпляра для NSLayoutConstraint и устанавливаете ее так:

headerViewHeightConstraint = [NSLayoutConstraint constraintWithItem:headerView
                                                          attribute:NSLayoutAttributeHeight
                                                          relatedBy:NSLayoutRelationEqual
                                                             toItem:nil
                                                          attribute:NSLayoutAttributeNotAnAttribute
                                                         multiplier:1.0f
                                                           constant:otherView.frame.size.height];

Вы можете изменить его размер:

headerViewHeightConstraint.constant = 1000.0f;
[headerView updateConstraintsIfNeeded];

P.S: имейте в виду, что addConstraints: - это не то же самое, что addConstraint:.

addConstraints используется в сочетании с массивом ограничений или [NSLayoutConstraints constraintsWithVisualFormat:...]

addConstraint: используется в сочетании с одним ограничением, которое является примером выше.

Если вы переопределяете layoutSubviews: вызов [super layoutSubviews] в своей первой строке. Это заставляет представление и его подзадачи самому компоновке, чтобы вы могли получить доступ к их деталям фрейма и т.д.