Автоматическая разметка для tableHeaderView
Я пытался улучшить свои методы верстки, изучая Auto Layout, но я наткнулся на проблему, которую я просто не смог решить.
Вот что происходит: есть контроллер представления, содержащий, помимо прочего, UITableView
и UIView
, Это представление размещено чуть ниже представления таблицы, и его высота не распространяется на всю высоту экрана (скажем, он занимает верхнюю половину экрана).
Табличное представление, использующее сгруппированный стиль и помещенное чуть выше упомянутого представления, имеет полупрозрачный фон, так что вы можете фактически увидеть содержимое представления прямо под ним. Так как представление занимает половину экрана, мне нужно добавить tableHeaderView (также полупрозрачный) к этому табличному представлению, чтобы весь фоновый контент был отчетливо виден при первой загрузке контроллера представления.
Окончательный эффект этого будет похож на фиксированный tableHeaderView, который исчезает на фоне при прокрутке табличного представления.
Это делается простым способом с использованием пружин и распорок, но 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's 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];
PS: имейте ввиду, что addConstraints:
это не то же самое, что addConstraint:
,
addConstraints
используется в сочетании с массивом ограничений или [NSLayoutConstraints constraintsWithVisualFormat:...]
addConstraint:
используется в сочетании с одним ограничением, которое является примером выше.
Если вы переопределяете layoutSubviews:
вызов [super layoutSubviews]
в самой первой строке. Это вынуждает представление и его подпредставления размещать себя так, чтобы вы могли получить доступ к деталям их кадров и т. Д.