2014-01-17 2 views
4

Я использую 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 называется - и это в конечном итоге - ограничения, похоже, работают; Я правильно вижу свою ячейку, и размер всех подзонов выглядит правильным. Мне просто не нравится видеть эти исключения в консоли, и я предпочел бы их устранить, если это возможно.

+0

Как и http://stackoverflow.com/questions/36929221/uitableview-when-changing-constraint-which-effects-height-of-cell-after-dequeuei. Вы когда-нибудь разрешали это? –

+0

Прошло некоторое время с тех пор, как я работал над этим приложением, но нет, я никогда не нашел подходящего обходного пути. :( – NathanAldenSr

ответ

0

Действительно нет чистого решения, которое я нашел, кроме изменения приоритета до 999 на одном из вертикальных ограничений. Это устранит само сообщение об ошибке.

Смежные вопросы