Добавление ограничения в представление заголовка UITableVIew

Так что я новичок в ограничениях.

У меня есть файл пера, который содержит несколько видов в качестве братьев и сестер. Представление ViewController содержит tableView, и у меня есть еще одно представление, которое будет добавлено в tableHeaderView (назовем его self.tableHeaderView).

Проблема, с которой я сталкиваюсь, заключается в том, что я хочу изменить размер self.tableHeaderView на основе определенных условий. Я добавил ограничения ко всем своим элементам пользовательского интерфейса и по какой-то причине не могу добавить ограничение по высоте в self.tableHeaderView через кончик.

Я попытался изменить рамку self.tableHeaderView программным способом, но это не имеет никакого эффекта, когда я запускаю код в симуляторе, что имеет смысл, потому что если я использую Auto-layout, он должен игнорировать изменения кадра.

Я попытался добавить ограничение по высоте программно, но он вылетает.

Это кусок кода, я должен добавить ограничение по высоте.

    [self.tableHeaderView addConstraint:[NSLayoutConstraint constraintWithItem:self.tableHeaderView attribute:NSLayoutAttributeHeight relatedBy:NSLayoutRelationEqual toItem:nil attribute:NSLayoutAttributeNotAnAttribute multiplier:1.0f constant:107.0f]];

Исключение, которое я получил: *** Ошибка подтверждения в - [UITableView layoutSublayersOfLayer:], /SourceCache/UIKit_Sim/UIKit-2903.2/UIView.m:8536


* Завершение работы приложения из-за необработанного исключения "NSInternalInconsistencyException", причина: "Автоматическое расположение все еще требуется после выполнения -layoutSubviews. Реализация -layoutSubviews в UITableView должна вызывать super.'*

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

Структура файла пера

Редактировать 1: я получаю это исключение, когда у меня есть self.topicHeaderView.translatesAutoresizingMaskIntoConstraints = NO;

Если у меня нет этого, я получаю это

Невозможно одновременно удовлетворить ограничения. Вероятно, по крайней мере одно из ограничений в следующем списке - это то, что вам не нужно. Попробуйте это: (1) посмотреть на каждое ограничение и попытаться выяснить, чего вы не ожидаете; (2) найдите код, который добавил нежелательное ограничение или ограничения, и исправьте его. (Примечание. Если вы видите не понятные NSAutoresizingMaskLayoutConstraints, обратитесь к документации по свойству UIView translatesAutoresizingMaskIntoConstraints) ( "", "")

Попытка восстановить, нарушив ограничение

Сломайте objc_exception_throw, чтобы поймать это в отладчике. Методы в категории UIConstraintBasedLayoutDebugging в UIView, перечисленные в, также могут быть полезны.

Редактировать: 2 На 4"экране это выглядит нормально (красный фон покрывает весь tableHeaderView, как я и ожидал) 4

На 3,5-дюймовом экране красный фон (который применяется к перу, расширяется до определенной высоты, даже если я установил высоту 117,0f. Элементы пользовательского интерфейса, которые находятся внутри tableHeaderView, отображаются правильно)

3,5

Синяя линия внизу - это разделительная линия, а синяя рамка - вокруг tableHeaderView.

2 ответа

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

Вы можете изменить высоту представления непосредственно в коде, установив тот же кадр с измененной высотой. Это работает нормально.

Также помните, что эти изменения не будут применены, пока вы не переназначите заголовок:

tableView.tableHeaderView.frame = ...;
tableView.tableHeaderView = tableView.tableHeaderView;

У меня была та же проблема, я не мог использовать ограничения для tableHeaderView.

Затем я создал другое подпредставление для создания ограничений.

// 1 - create a header view and a subHeaderView
UIView *headerView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, bounds.size.width, bounds.size.height - 64.f)];
headerView.backgroundColor = [UIColor blackColor];

tableView.tableHeaderView = headerView;

UIView *subHeaderView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, bounds.size.width, bounds.size.height - 64.f)];
[headerView addSubview:subHeaderView];

// 2 - add constrainedView to subHeaderView (E.g.)
UIView *constrainedView = [UIView new];
[constrainedView setTranslatesAutoresizingMaskIntoConstraints:NO];
[subHeaderView addSubView:constrainedView];

// 3 - addConstraints of subviews into subHeaderView (E.g.)
[subHeaderView addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|[constrainedView]|" options:0 metrics:metrics views:views]];
[subHeaderView addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|[constrainedView]|" options:0 metrics:metrics views:views]];

Это работает над моим проектом, iOS 7.0 / Xcode 5.0.2

Другие вопросы по тегам