UITableViewCell с AutoLayout - сбой ограничения ширины содержимогоViewView

У меня проблемы с табличным представлением динамического размера в iOS 8. Хотя он визуально выглядит нормально, я получаю выход журнала с ошибками AutoLayout. Я привел его к этому простому примеру.

Я добавляю UILabel в свою ячейку:

self.titleLabel = [[UILabel alloc] init];
self.titleLabel.translatesAutoresizingMaskIntoConstraints = NO;
self.titleLabel.numberOfLines = 0;
self.titleLabel.lineBreakMode = NSLineBreakByWordWrapping;
[self.contentView addSubview:self.titleLabel];

Я создаю свои ограничения макета в коде, используя Masonry, в updateConstraints:

[self.titleLabel setContentCompressionResistancePriority:UILayoutPriorityRequired forAxis:UILayoutConstraintAxisVertical];
[self.titleLabel updateConstraints:^(MASConstraintMaker *make) {
    make.leading.equalTo(self.contentView.leading).with.offset(padding.left);
    make.trailing.equalTo(self.contentView.trailing).with.offset(-padding.right);
    make.top.equalTo(self.contentView.top).with.offset(padding.top);
    make.bottom.equalTo(self.contentView.bottom).with.offset(-padding.bottom / 2);
}];

(я мог бы сделать это за один шаг с make.edges, но проблема такая же)

Это изначально выглядит и отлично работает. Затем, когда я выполняю какие-либо изменения в представлении таблицы и вызываю [tableView endUpdates] (предположительно запускающий updateContraints), я получаю следующее в журнале консоли:

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) 
(
    "<MASLayoutConstraint:0x7ff4842551e0 UILabel:self.titleLabel.leading == UITableViewCellContentView:self.contentView.leading + 12>",
    "<MASLayoutConstraint:0x7ff484255240 UILabel:self.titleLabel.trailing == UITableViewCellContentView:self.contentView.trailing - 12>",
    "<NSLayoutConstraint:0x7ff484256df0 UITableViewCellContentView:self.contentView.width ==>"
)

Will attempt to recover by breaking constraint 
<MASLayoutConstraint:0x7ff484255240 UILabel:self.titleLabel.trailing == UITableViewCellContentView:self.contentView.trailing - 12>

Я не понимаю, в чем проблема, - я хочу, чтобы метка имела дополнение, но почему это противоречит общей ширине contentView?

Изменить 1:

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

Ответ 1

У вас есть три ограничения с одним и тем же приоритетом, что заставляет систему сбивать с толку, как их полностью удовлетворить.    ",   " ",   " "

Поскольку ширина вашей ячейки также фиксируется в соответствии с шириной вашего устройства, я предлагаю использовать немного слабый приоритет для ограничений вашего представления.

[self.titleLabel updateConstraints:^(MASConstraintMaker *make) {
    make.leading.equalTo(self.contentView.leading).with.offset(padding.left).priority(999);
    make.trailing.equalTo(self.contentView.trailing).with.offset(-padding.right).priority(999);
    make.top.equalTo(self.contentView.top).with.offset(padding.top);
    make.bottom.equalTo(self.contentView.bottom).with.offset(-padding.bottom / 2);
}];

Ответ 2

В соответствии с вашим вопросом, похоже, что вы поместили ярлык в пользовательскую ячейку в xib или раскадровку, и теперь, когда вы пытаетесь установить ограничения вручную, это не соответствует ограничениям, которые вы задали программным путем. Так что я предлагаю создавать метки метки программно и применять ограничения.

вы также можете: программно создавать ограничения компоновки

EDIT 1:
Попробуйте воспользоваться этой ссылкой, это может быть полезно для вас, и это может решить проблему, с которой вы сталкиваетесь.
http://captechconsulting.com/blog/tyler-tillage/ios-8-tutorial-series-auto-sizing-table-cells

Ответ 3

Вы настроили UITableView перед использованием динамических вычислений высоты ячейки? У меня очень похожая проблема, и этот код помогает мне

- (void)viewDidLoad {
  [super viewDidLoad];
  self.tableView.estimatedRowHeight = 150;
  self.tableView.rowHeight = UITableViewAutomaticDimension;
}

У меня нет опыта работы с каркасом масонства, но стандартные ограничения отлично подходят для меня. Может быть, у вас что-то не так с форматом масонства?

    self.titleLabel = [[UILabel alloc] init];
    self.titleLabel.translatesAutoresizingMaskIntoConstraints = NO;
    self.titleLabel.numberOfLines = 0;
    self.titleLabel.lineBreakMode = NSLineBreakByWordWrapping;
    [self.contentView addSubview:self.titleLabel];
    NSArray *constraintsHorizontal = [NSLayoutConstraint constraintsWithVisualFormat:@"H:|-12-[_titleLabel]-12-|" options:0 metrics:nil views:NSDictionaryOfVariableBindings(_titleLabel)];
    NSArray *constraintsVertical = [NSLayoutConstraint constraintsWithVisualFormat:@"V:|-12-[_titleLabel]-12-|" options:0 metrics:nil views:NSDictionaryOfVariableBindings(_titleLabel)];
    [self.contentView addConstraints:constraintsHorizontal];
    [self.contentView addConstraints:constraintsVertical];

Проверить тестовый проект на https://dl.dropboxusercontent.com/u/48223929/TestTableCellsAutolayout.zip