Автомакет аварийно завершает работу из-за дополнительного ограничения по высоте

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

@property (weak, nonatomic) UILabel *name;

Вот как я создаю ограничение.

NSLayoutConstraint *labelHeightContraint = [NSLayoutConstraint constraintWithItem:self.name attribute:NSLayoutAttributeHeight relatedBy:NSLayoutRelationEqual toItem:nil attribute:NSLayoutAttributeNotAnAttribute multiplier:1.0f constant:labelSize.height];
[self.name addConstraint:labelHeightContraint];

И это ошибка, которую я получаю.

Unable to simultaneously satisfy constraints.

(
    "<NSLayoutConstraint:0x9ff8770 V:[UILabel:0x9ff72d0(60.843)]>",
    "<NSLayoutConstraint:0x9feb590 V:[UILabel:0x9ff72d0(40.562)]>"
)

Кажется, у меня есть 2 ограничения по высоте, что не имеет для меня смысла. В Interface Building у меня нет ограничений по высоте (см. скриншот). Ярлык скриншота

Распечатка ограничений перед сбоем показывает ограничение по высоте.

<__NSArrayM 0x9eb0a00>(
<NSLayoutConstraint:0x9ea1670 V:[UILabel:0x9eb2e30(60.843)]>,
<NSContentSizeLayoutConstraint:0x9fa0580 H:[UILabel:0x9eb2e30(72)] Hug:251 CompressionResistance:750>,
<NSContentSizeLayoutConstraint:0x9fa7bf0 V:[UILabel:0x9eb2e30(61)] Hug:251 CompressionResistance:750>
)

Ограничение, которое я рассчитываю, равно

<NSLayoutConstraint:0x9ea9b50 V:[UILabel:0x9eb2e30(40.562)]>

person Kevin    schedule 25.01.2014    source источник


Ответы (2)


Просто попробуйте установить приоритет для каждого ограничения

person Bimawa    schedule 30.01.2014
comment
ваш ответ должен состоять из нескольких ссылок на помощь или код или даже какое-то объяснение. это нельзя рассматривать как ответ - person Nitin Jain; 30.01.2014
comment
Этот простой конфликт CompressionResistance с height UILabel. Этому автору нужно поиграть с избыточностью - person Bimawa; 30.01.2014
comment
Раньше я пробовал это, это остановило сбой, но не решило проблему. - person Kevin; 30.01.2014

UICollectionView повторно использует все свои UICollectionViewCell экземпляры. Когда один из них удалялся за пределы экрана, он использовался повторно. Для разных ячеек требовалась разная высота, поэтому ограничения по высоте были разными для каждой ячейки. Ограничения по высоте не удалялись при повторном использовании ячейки, поэтому это было причиной множественных ограничений по высоте и сбоя.

Решение заключалось в том, чтобы не использовать автоматическую компоновку и просто изменить рамку (да, я пытался удалить ограничение по высоте, не сработало).

CGRect labelFrame = self.name.frame;
labelFrame.size.height = labelSize.height;
self.name.frame = labelFrame;
person Kevin    schedule 30.01.2014