UICollectionView Cell + UiLabel с AutoLayout

Я пытаюсь подключить UILabel к родительской ячейке. Я добавил четыре ограничения (верхний, верхний, конечный, нижний) , который отлично работает на iOS 8.0, но не на iOS 7.X. См. Изображение ниже:

[Нажмите здесь для увеличения]

enter image description here

Что я делаю неправильно? Пожалуйста, советую!

EDIT # 1

Кажется, он только сломан с Xcode 6 GM. Мой подход работал отлично в Xcode 6 beta 7.

Кроме того, если я уменьшаю ширину внутреннего вида, он выдает следующее предупреждение:

2014-09-10 19:58:28.109 Test[57827:60b] 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:0x799573a0 H:|-(8)-[UIView:0x798a86e0]   (Names: '|':UIView:0x798ae5d0 )>",
    "<NSLayoutConstraint:0x799573d0 H:[UIView:0x798a86e0]-(43)-|   (Names: '|':UIView:0x798ae5d0 )>",
    "<NSAutoresizingMaskLayoutConstraint:0x798a8b00 h=--& v=--& H:[UIView:0x798ae5d0(50)]>"
)

Will attempt to recover by breaking constraint 
<NSLayoutConstraint:0x799573d0 H:[UIView:0x798a86e0]-(43)-|   (Names: '|':UIView:0x798ae5d0 )>

Break on objc_exception_throw to catch this in the debugger.
The methods in the UIConstraintBasedLayoutDebugging category on UIView listed in <UIKit/UIView.h> may also be helpful.

Ответ 1

Переопределение пользовательской ячейки layoutSubviews является возможным обходным путем:

override func layoutSubviews() {
    contentView.frame = bounds
    super.layoutSubviews()
}

Ответ 2

UIView: 0x798ae5d0 - это contentView CollectionViewCell. Так или иначе, в определенный момент он использует UICollectionViewCells defaultSize, который равен (50.0, 50.0).

<NSAutoresizingMaskLayoutConstraint:0x798a8b00 h=--& v=--& H:[UIView:0x798ae5d0(50)]>

Поскольку ваши горизонтальные поля 8 + 43 = 51 больше, чем contentView (50), невозможно удовлетворить макет.

<NSLayoutConstraint:0x799573a0 H:|-(8)-[UIView:0x798a86e0]   (Names: '|':UIView:0x798ae5d0 )>
<NSLayoutConstraint:0x799573d0 H:[UIView:0x798a86e0]-(43)-|  (Names: '|':UIView:0x798ae5d0 )>

Можно сделать макет более гибким, чтобы он также работал с размером (50,0, 50,0). В вашем случае, изменяя равным 43 на <= 43 или уменьшая приоритет от 1000 до 750 или 999.

Ответ 3

Проблема заключается в том, что ваш пользовательский вид (UILabel) имеет ограничения, которые конфликтуют с ограничениями ячейки (или лучшего содержимого cellView). Ячейка NSAutoresizingMaskLayoutConstraint создается автоматически из того, что вы установили в свойствах UICollectionView в xib (или раскадровке) в качестве размера ячейки. Я решил свою аналогичную проблему (*), явно установив

- (void)awakeFromNib {

    [super awakeFromNib];

    self.contentView.translatesAutoresizingMaskIntoConstraints = NO;
}

в моем пользовательском подклассе UICollectionViewCell. Это избавляет от ограничения размера ячейки, установленного в Storyboard.

(*) Отказ от ответственности: у моей коллекцииView есть ячейки для определения размера, основанные на их представлении содержимого, которое определяется автозапуском. У меня были предупреждения о конфликтующих ограничениях автозапуска контента и явный размер в Storyboard. Это помогло мне избавиться от этих предупреждений.

Ответ 4

Вместо четырех ограничений (верхний, верхний, конечный, нижний). Попробуйте верхнюю, верхнюю, ширину и высоту. Он должен работать.

Ответ 5

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

enter image description here

Ответ 6

Еще одна возможность, которую я нашел в своем проекте.

Обычно я копирую/вставляю подобные объекты, но при этом иногда имеет тот же идентификатор.
Поэтому я исправил проблему ограничения, создав объект с нуля.