У меня есть подкласс UITableViewCell, который содержит многострочную метку, и я хотел бы, чтобы ячейка динамически определяла динамику на основе содержимого этой метки. Я знаю, что iOS 8 вводил автоматическую калибровку ячеек на основе ограничений AutoLayout, и я нашел несколько примеров этого уже в SO, но у меня все еще есть некоторые проблемы с реализацией этого поведения.
Здесь моя реализация updateConstraints:
- (void)updateConstraints {
[super updateConstraints];
[self addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|-10-[_nameLabel(==20)]-10-[_tweetLabel]" options:0 metrics:nil views:NSDictionaryOfVariableBindings(_nameLabel, _tweetLabel)]];
[self addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:[_avatarView]-10-[_nameLabel]-10-|" options:0 metrics:nil views:NSDictionaryOfVariableBindings(_avatarView, _nameLabel)]];
[self addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:[_nameLabel]-10-[_tweetLabel]-10-|" options:0 metrics:nil views:NSDictionaryOfVariableBindings(_nameLabel, _tweetLabel)]];
[self addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:[_avatarView]-10-[_tweetLabel]-10-|" options:0 metrics:nil views:NSDictionaryOfVariableBindings(_avatarView, _tweetLabel)]];
[self addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|-10-[_avatarView(==45)]" options:0 metrics:nil views:NSDictionaryOfVariableBindings(_avatarView)]];
[self addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|-10-[_avatarView(==45)]" options:0 metrics:nil views:NSDictionaryOfVariableBindings(_avatarView)]];
}
В контроллере табличного представления я установил высоту строки в UITableViewAutomaticDimension (и я также установил примерную высоту строки). Во время выполнения я получаю серию ошибок автоматического макета, и все ячейки представления таблиц кажутся почти полностью перекрывающимися.
Контексты автоматического компоновки заключаются между следующими ограничениями:
-
V:|-(10)-[_nameLabel]
-
V:[_nameLabel(20)]
-
V:[_nameLabel]-(10)-[_tweetLabel]
-
V:[_tweetLabel]-(10)-|
-
V:[cell(44)]
Я подозреваю, что последнее ограничение "UIView-Encapsulated-Layout-Height", которое заставляет высоту 44, является причиной проблемы, но я не совсем уверен, откуда это происходит, поэтому, надеюсь, кто-то может пролить некоторый свет в этом вопросе.