Я пытаюсь улучшить свои макеты, изучая 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
.