IOS - проблема самоконтроля клеток
Я столкнулся с проблемой автоматического определения размера ячеек с использованием Auto Layout. Моя цель - создать таблицу, которая будет выглядеть примерно так:
| Title_label (time) $price |
| |
|Some long description. More |
|description. |
| |
Когда заголовок длинный, он должен выглядеть так:
| This title is (time) $price |
| really long |
| |
|Some long description. More |
|description. |
| |
Поэтому, когда заголовок становится больше, он сдвигает метку времени вправо до тех пор, пока между временем и ценой есть 8 точек. Если оно еще больше, оно должно переноситься на следующую строку.
Я делал до представления таблицы с саморазмерными ячейками, но там, где только одна расширяющаяся метка, а не две.
Я реализовал автоматическую высоту строки:
self.tableView.rowHeight = UITableViewAutomaticDimension
self.tableView.estimatedRowHeight = 100
Вот как выглядят мои ограничения:
| 8px
|8px title 8px time >=8px price|
| 8px |
|8px description 8px|
| 8px |
Существует также верхнее выравнивание между временем цены и заголовком.
Я установил номер строки заголовка и описания на 0. Я установил сопротивление сжатия времени и цены на 1000 (потому что заголовок перекрывал их).
Однако метка заголовка не переносится на следующую строку. Это заканчивается.... Что более метка описания также слишком мала. Когда я прокручиваю таблицу, высота описания фиксируется.
Я попытался добавить cell.layoutIfNeeded() перед возвращением ячейки. Тогда расположение ячеек испортится (заголовок будет обрезан), но когда я прокручиваю тв, все в порядке.
Есть идеи?
Изменить: Это потому, что заголовок метки находится рядом с другими метками, и он не знает, когда он должен переноситься?
Я старался
override func layoutSubviews() {
self.nameLabel.preferredMaxLayoutWidth -= (durationLabel.frame.width + priceLabel.frame.width + 16)
super.layoutSubviews()
}
сказать заголовку метки, какова его максимальная ширина, но он все испортил.
4 ответа
Попробуйте добавить
[cell layoutIfNeeded]
перед возвратом вашей настроенной ячейки.
Как и вы, я установил для строк заголовка и описания значение 0 и настроил вашу ячейку следующим образом:
| 8px
|8px title 8px time >=8px price|
| 8px |
|8px description 8px|
| 8px |
Затем я установил свойства сжатия и обтекания:
заглавие:
- Обниматься: H: 251, V: 252
- Сжатие: H: 999, V: 1000
время:
- Обниматься: H:253, V:251
- Сжатие: H:1000, V:750
цена:
- Обниматься: H: 252, V: 251
- Сжатие: H:1000, V:750
описание:
- Обниматься: H: 251, V: 251
- Сжатие: H:750, V:999
Все работает как положено
Вы можете сначала добавить ограничение к цене как начало, вершина, высота, ширина. затем отметьте время как верх, трейлинг, высота, ширина. Для надписи заголовка как ведущий, трейлинг, верх, низ. Для описания ярлык ведущий, трейлинг, верх, низ. и напишите следующий код. heightForRowAtIndexPath даст вам правильную высоту для вашей ячейки
-(CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
static YOUR_TABLEVIEW_CELL *sizingCell = nil;
static NSString *CellIdentifier=@"YOUR_TABLEVIEW_CELL_IDENTIFIER";
sizingCell =[tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (sizingCell==nil)
{
sizingCell=[[YOUR_TABLEVIEW_CELL alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
}
[self configureFareIssueCell:sizingCell atIndexPath:indexPath];
return [self calculateHeightForConfiguredSizingCell:sizingCell];
}
//assign all the labels here
- (void)configureFareIssueCell:(YOUR_TABLEVIEW_CELL* )cell atIndexPath:(NSIndexPath *)indexPath
{
//e.g
cell.lbl.text=@"YOUR_TEXT";
cell.imageView.image=[UIImage imageNamed:@"NAME_OF_YOUR_IMAGE"];
}
- (CGFloat)calculateHeightForConfiguredSizingCell:(YOUR_TABLEVIEW_CELL *)sizingCell
{
CGSize size = [sizingCell.contentView systemLayoutSizeFittingSize:UILayoutFittingCompressedSize];
return size.height + 1.0f; // Add 1.0f for the cell separator height
}
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
static NSString *CellIdentifier=@"YOUR_TABLEVIEW_CELL_IDENTIFIER";
YOUR_TABLEVIEW_CELL *cell =[tableView dequeueReusableCellWithIdentifier:@"YOUR_TABLEVIEW_CELL_IDENTIFIER"];
if (cell==nil)
{
cell=[[YOUR_TABLEVIEW_CELL alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
}
[self configureFareIssueCell:cell atIndexPath:indexPath];
return cell;
}
добавить минимальную ширину к метке времени и цены
установить приоритеты обниматься тоже
заголовок:
Обниматься: H: 1000, V: 1000
Сжатие: H: 1000, V: 1000
метка описания:
Обниматься: H: 1000, V: 999
Сжатие: H: 1000, V: 999
добавьте эту строку в конец cellforRowAtIndexPath и удалите layoutSubviews
клетка?.layoutIfNeeded()
добавить эту функцию
functableView(tableView: UITableView, оценка HeightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat {return UITableViewAutomaticDimension}
functableView(tableView: UITableView, heightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat {return UITableViewAutomaticDimension}
5 Построить и запустить