У меня есть UITableViewController, сгруппированный стиль, с пользовательским UITableViewCell. В UITableViewCell у меня есть NSLayoutConstraints, определенные в раскадровке (в ячейке прототипа), которые определяют размер и расположение UIImageView. Эти NSLayoutConstraints связаны со свойствами подкласса UITableViewCell.Настройка NSLayoutConstraint на ячейку на UITableView
В - (пустотах) layoutSubviews способе наследнике UITableViewCell, я пытаюсь использовать
self.topSpacingConstraint.constant = 0;
, чтобы изменить расположение на основе каждой клетки.
Эта строка кода регулирует ограничение для всех моих ячеек. Я не понимаю, почему, и я не знаю, как установить ограничение для одной ячейки.
Update
Вот полный код -(void)layoutSubviews
метода подкласса UITableViewCell. self.topCell
и self.bottomCell
- это свойства, установленные UITableViewController при настройке ячейки. Исходя из этих значений, я пытаюсь обновить интервал AutoLayout изображения на основе каждой клетки:
- (void)layoutSubviews
{
[super layoutSubviews];
UIImage *mask;
if (self.topCell && self.bottomCell) {
self.imageSpacingTopConstraint.constant = 1;
self.imageSpacingBottomConstraint.constant = 2;
mask = MTDContextCreateRoundedMask(self.wineImage.bounds, 6.0, 0.0, 6.0, 0.0);
} else if (self.topCell) {
self.imageSpacingTopConstraint.constant = 1;
self.imageSpacingBottomConstraint.constant = 0;
mask = MTDContextCreateRoundedMask(self.wineImage.bounds, 6.0, 0.0, 0.0, 0.0);
} else if (self.bottomCell) {
self.imageSpacingTopConstraint.constant = 0;
self.imageSpacingBottomConstraint.constant = 2;
mask = MTDContextCreateRoundedMask(self.wineImage.bounds, 0.0, 0.0, 6.0, 0.0);
} else {
self.imageSpacingTopConstraint.constant = 0;
self.imageSpacingBottomConstraint.constant = 0;
mask = MTDContextCreateRoundedMask(self.wineImage.bounds, 0.0, 0.0, 0.0, 0.0);
}
CALayer *layerMask = [CALayer layer];
layerMask.frame = self.wineImage.bounds;
layerMask.contents = (id)mask.CGImage;
self.wineImage.layer.mask = layerMask;
}
Моей потребность сделать это вытекает из противоречивой высоты ячеек на столе с сгруппированным стилем. Верхняя и нижняя ячейки на 1pt выше, чем «средние» ячейки, в то время как одна ячейка в таблице на 2 метра выше. Использование одинаковых ограничений расстояния для изображения во всех ячейках приводит к тому, что изображение частично скрывает границы ячеек для некоторых ячеек или оставляет пробелы между изображением и границей в других.
Если кто-нибудь может подумать о более легком способе напасть на это, я был бы признателен.
Решение
Per маркированного решения ниже, устранение ограничений распорных изображений, а затем создать новые ограничения между изображением и cell.contentView сделал трюк. Я удалил код, чтобы скорректировать ограничения из метода -(void)layoutSubviews
. Я добавил код, чтобы удалить и сделать новые ограничения для awakeFromNib
подкласса UITableViewCell:
- (void)awakeFromNib
{
[super awakeFromNib];
// Since Xcode 4.6.3 creates constrain relationships between the image and the cell, we need to delete and then recreate between the image and the cell.contentView
[self removeConstraint:self.imageSpacingTopConstraint];
[self removeConstraint:self.imageSpacingBottomConstraint];
self.imageSpacingTopConstraint = [NSLayoutConstraint constraintWithItem:self.wineImage attribute:NSLayoutAttributeTop relatedBy:NSLayoutRelationEqual toItem:self.contentView attribute:NSLayoutAttributeTop multiplier:1.0 constant:0.0];
self.imageSpacingBottomConstraint = [NSLayoutConstraint constraintWithItem:self.wineImage attribute:NSLayoutAttributeBottom relatedBy:NSLayoutRelationEqual toItem:self.contentView attribute:NSLayoutAttributeBottom multiplier:1.0 constant:0.0];
[self addConstraint:self.imageSpacingTopConstraint];
[self addConstraint:self.imageSpacingBottomConstraint];
}
Разве ваши ячейки не используются повторно? Вам нужно будет сбросить это свойство в, например, 'cellForRowAtIndexPath'. –
Они используются повторно, но я уверен, что это не проблема. Если я загружаю таблицу только тремя ячейками, все видимые и только изменяют значение прототипа для одного из трех, изменения макета во всех трех ячейках. –
Пожалуйста, покажите полный метод layoutSubviews. – jrturton