У меня есть массив элементов, которые будут отображаться внутри моего UITableViewCell
. Каждый из этих элементов будет динамически отображаться с помощью UILabel
. Я использую autolayout для настройки макета представлений.
Вот как я размещаю свой tableViewCell
:
+------------------------------------------------+
| [cellView] |
| +---------------------------------------------+|
| |[otherView] <- fixed height ||
| | +------------------------------------------+||
| | |[UILabel] |||
| | +------------------------------------------+||
| +---------------------------------------------+|
| +---------------------------------------------+|
| |[itemView] ||
| | +---------------------------+ +------------+||
| | |[itemLabel] |-|[priceLabel]|||
| | +---------------------------+ +------------+||
| | +---------------------------+ +------------+||
| | |[itemLabel] |-|[priceLabel]|||
| | +---------------------------+ +------------+||
| | ||
| | --Add the next UILabels dynamically-- ||
| +---------------------------------------------+|
+------------------------------------------------+
Для ясности
otherView
: внутри него 2UILabel
. Фиксированная высота.itemView
: есть неизвестное количествоitemLabel
иpriceLabel
внутри. Изменяет размер высоты на основе числаitems
.- Каждое из ограничений представлений устанавливается с помощью раскадровки, кроме
itemLabel
иpriceLabel
.
Внутри моего cellForRowAtIndexPath
я установил ограничения itemLabel
и priceLabel
, используя constraintsWithVisualFormat:
for (NSDictionary *item in items) {
UILabel *itemLabel = [[UILabel alloc] init];
itemLabel.translatesAutoresizingMaskIntoConstraints = NO;
itemLabel.font = [UIFont systemFontOfSize:14.0f];
itemLabel.backgroundColor = [UIColor yellowColor];
itemLabel.text = [item valueForKey:@"item_name"];
[cell.itemView addSubview:itemLabel];
UILabel *priceLabel = [[UILabel alloc] init];
priceLabel.translatesAutoresizingMaskIntoConstraints = NO;
priceLabel.font = [UIFont systemFontOfSize:14.0f];
priceLabel.textAlignment = NSTextAlignmentRight;
priceLabel.backgroundColor = [UIColor greenColor];
priceLabel.text = [NSString stringWithFormat:@"RM %@", [item valueForKey:@"price"]];
[cell.itemView addSubview:priceLabel];
NSDictionary *viewsDictionary = NSDictionaryOfVariableBindings(cell.itemView, itemLabel, priceLabel);
[cell.itemView addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|[itemLabel]-5-[priceLabel(70)]|"
options:0
metrics:nil
views:viewsDictionary]];
[cell.itemView addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|[itemLabel]|"
options:0
metrics:nil
views:viewsDictionary]];
[cell.itemView addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|[priceLabel]|"
options:0
metrics:nil
views:viewsDictionary]];
}
Конечный результат, как показано ниже. Единственная проблема заключается в том, что созданные itemLabel
и priceLabel
перекрывают друг друга, а не выравниваются сверху вниз.
Как правильно установить ограничения, чтобы itemLabel
и priceLabel
хорошо выровнялись сверху вниз, а размер itemView
изменялся в зависимости от количества элементов внутри него?