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;
}  
  1. добавить минимальную ширину к метке времени и цены

  2. установить приоритеты обниматься тоже

заголовок:

Обниматься: H: 1000, V: 1000

Сжатие: H: 1000, V: 1000

метка описания:

Обниматься: H: 1000, V: 999

Сжатие: H: 1000, V: 999

  1. добавьте эту строку в конец cellforRowAtIndexPath и удалите layoutSubviews

    клетка?.layoutIfNeeded()

  2. добавить эту функцию

    functableView(tableView: UITableView, оценка HeightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat {return UITableViewAutomaticDimension}

functableView(tableView: UITableView, heightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat {return UITableViewAutomaticDimension}

5 Построить и запустить

Другие вопросы по тегам