Я использую Xcode 5 с iOS 7 SDK. У меня есть UITableViewCell, определенный как прототип в моей раскадровке, и я использую autolayout для subviews внутри ячейки. Когда клетка запрашивается cellForRowAtIndexPath
, я заполнить ячейки с данными:Обновление ограничений UITableViewCell вызывает исключение
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
ActivityTableViewCell *tableViewCell = [tableView dequeueReusableCellWithIdentifier:@"Activity"];
Activity *activity = self.activities[(NSUInteger)indexPath.row];
[tableViewCell configureWithActivity:activity];
return tableViewCell;
}
Эти данные могут привести к высоте одного из подвидов изменить. Я меняю высоту подвид путем изменения его ограничения, наряду с другими изменениями ограничений:
@implementation ActivityTableViewCell
- (void)updateConstraints
{
// Update constraints based on the activity
self.activityDocumentsTableViewHeightLayoutConstraint.constant = ...;
self.betweenActivityDocumentsTableViewAndNotesLabelLayoutConstraint.constant = ...;
self.activityNotesTableViewHeightLayoutConstraint.constant = ...;
self.betweenActivityNotesTableViewAndContentViewLayoutConstraint.constant = ...;
[super updateConstraints];
}
- (void)configureWithActivity:(Activity *)activity
{
// Populate subviews using the activity variable
[self setNeedsUpdateConstraints];
}
@end
Мой ActivityTableViewCell класс является производным от другого класса, который указывает вид контента автоматически размер, чтобы соответствовать его динамически размера подвидов:
self.contentView.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight;
Контроллер my view предварительно вычисляет высоты всех этих ячеек и сохраняет их в массиве. Эти высоты поставляются в heightForRowAtIndexPath
.
Все это прекрасно работает, пока я не прокручивать вид таблицы:
2014-01-17 10:41:47.435 ... Unable to simultaneously satisfy constraints.
Probably at least one of the constraints in the following list is one you don't want. Try this: (1) look at each constraint and try to figure out which you don't expect; (2) find the code that added the unwanted constraint or constraints and fix it. (Note: If you're seeing NSAutoresizingMaskLayoutConstraints that you don't understand, refer to the documentation for the UIView property translatesAutoresizingMaskIntoConstraints)
(
"<NSLayoutConstraint:0x13c4a520 UnknownLabel:0x13c4a440.height == 26>",
"<NSLayoutConstraint:0x13c4ad20 BorderedTableView:0xd46e000.height == 54>",
"<NSLayoutConstraint:0x13c4b800 UnknownLabel:0x13c4b720.height == 26>",
"<NSLayoutConstraint:0x13c4be40 BorderedTableView:0xd462600.height == 74>",
"<NSLayoutConstraint:0x13c4cc60 BorderedTableView:0xd46e000.top == UnknownLabel:0x13c4a440.bottom + 8>",
"<NSLayoutConstraint:0x13c4ccc0 BorderedTableView:0xd462600.top == UnknownLabel:0x13c4b720.bottom + 8>",
"<NSLayoutConstraint:0x13c4cd20 UITableViewCellContentView:0x13c49de0.bottom == BorderedTableView:0xd462600.bottom + 8>",
"<NSLayoutConstraint:0x13c4cd50 UnknownLabel:0x13c4a440.top == UITableViewCellContentView:0x13c49de0.top + 20>",
"<NSLayoutConstraint:0x13c4cd80 UnknownLabel:0x13c4b720.top == BorderedTableView:0xd46e000.bottom + 55>",
"<NSAutoresizingMaskLayoutConstraint:0xb2c1bf0 UITableViewCellContentView:0x13c49de0.height == UITableViewCellScrollView:0x13c4d000.height>",
"<NSAutoresizingMaskLayoutConstraint:0xb2c2460 UITableViewCellScrollView:0x13c4d000.height == ActivityTableViewCell:0x13c49be0.height>",
"<NSAutoresizingMaskLayoutConstraint:0x13935110 ActivityTableViewCell:0x13c49be0.height == 318>"
)
Обратите внимание, что сумма всех вертикальных констант делает не общий 318, таким образом, исключение. 318 исходит из моей предварительно рассчитанной высоты и является правильной высотой для этой ячейки. Тем не менее, четвертое ограничение в этом исключении, "<NSLayoutConstraint:0x13c4be40 BorderedTableView:0xd462600.height == 74>"
, неверно (оно было исправлено в первый раз, когда эта ячейка была удалена и настроена). Это связано с тем, что iOS применяет высоту строки до, вызывая метод моей ячейки updateConstraints
, который сам обновляет это четвертое ограничение до его правильного значения.
Я пробовал многочисленные комбинации звонков updateConstraints
, setNeedsLayout
и т. Д., Все безрезультатно. Я просто не могу понять, как предотвратить обновление iOS маски автоопределения до мои ограничения были обновлены. Хорошей новостью является то, что послеupdateConstraints
называется - и это в конечном итоге - ограничения, похоже, работают; Я правильно вижу свою ячейку, и размер всех подзонов выглядит правильным. Мне просто не нравится видеть эти исключения в консоли, и я предпочел бы их устранить, если это возможно.
Как и http://stackoverflow.com/questions/36929221/uitableview-when-changing-constraint-which-effects-height-of-cell-after-dequeuei. Вы когда-нибудь разрешали это? –
Прошло некоторое время с тех пор, как я работал над этим приложением, но нет, я никогда не нашел подходящего обходного пути. :( – NathanAldenSr