Ответ 1
Переопределение пользовательской ячейки layoutSubviews
является возможным обходным путем:
override func layoutSubviews() {
contentView.frame = bounds
super.layoutSubviews()
}
Я пытаюсь подключить UILabel к родительской ячейке. Я добавил четыре ограничения (верхний, верхний, конечный, нижний) , который отлично работает на iOS 8.0, но не на iOS 7.X. См. Изображение ниже:
[Нажмите здесь для увеличения]
Что я делаю неправильно? Пожалуйста, советую!
Кажется, он только сломан с 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.
Переопределение пользовательской ячейки layoutSubviews
является возможным обходным путем:
override func layoutSubviews() {
contentView.frame = bounds
super.layoutSubviews()
}
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.
Проблема заключается в том, что ваш пользовательский вид (UILabel) имеет ограничения, которые конфликтуют с ограничениями ячейки (или лучшего содержимого cellView). Ячейка NSAutoresizingMaskLayoutConstraint создается автоматически из того, что вы установили в свойствах UICollectionView в xib (или раскадровке) в качестве размера ячейки. Я решил свою аналогичную проблему (*), явно установив
- (void)awakeFromNib {
[super awakeFromNib];
self.contentView.translatesAutoresizingMaskIntoConstraints = NO;
}
в моем пользовательском подклассе UICollectionViewCell. Это избавляет от ограничения размера ячейки, установленного в Storyboard.
(*) Отказ от ответственности: у моей коллекцииView есть ячейки для определения размера, основанные на их представлении содержимого, которое определяется автозапуском. У меня были предупреждения о конфликтующих ограничениях автозапуска контента и явный размер в Storyboard. Это помогло мне избавиться от этих предупреждений.
Вместо четырех ограничений (верхний, верхний, конечный, нижний). Попробуйте верхнюю, верхнюю, ширину и высоту. Он должен работать.
Надеюсь, вы добавили ограничения к коллекции по отношению к этому родительскому (это будет представление UIViewController), так что ширина и высота будут равны родительскому виду.
Еще одна возможность, которую я нашел в своем проекте.
Обычно я копирую/вставляю подобные объекты, но при этом иногда имеет тот же идентификатор.
Поэтому я исправил проблему ограничения, создав объект с нуля.