Как создать ячейку многострочной таблицы в iOS? - PullRequest
8 голосов
/ 10 февраля 2011

Как я могу заставить вторую ячейку расширяться, чтобы соответствовать тексту, а не масштабировать текст?Есть ли встроенный способ сделать это в iOS, или мне нужно будет придумать какое-нибудь домашнее решение?Если вы загляните в приложение «Контакты iOS», для адреса есть поле, подобное этому.Я не могу найти, как это реализовать, хотя.

Table screenshot


Для тех, кто хочет добиться этого в будущем, вот код моего решения:

Файл HEADER:

#define FONT_SIZE 22.0f
#define CELL_CONTENT_WIDTH 320.0f
#define CELL_CONTENT_MARGIN 5.0f

Файл РЕАЛИЗАЦИИ:

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath {

    if (indexPath.section == 0 && indexPath.row == 1) {

        NSString *text = [atmAnnotation address];

        CGSize constraint = CGSizeMake(CELL_CONTENT_WIDTH - (CELL_CONTENT_MARGIN * 2), 20000.0f);

        CGSize size = [text sizeWithFont:[UIFont systemFontOfSize:FONT_SIZE] constrainedToSize:constraint lineBreakMode:UILineBreakModeWordWrap];
        NSLog(@"Size for address is Height:%f Width:%f",size.height,size.width);

        CGFloat height = MAX(size.height, 44.0f);

        return height + (CELL_CONTENT_MARGIN * 2);  

    }
    return 44.0f;
}

Вот скриншот с результатом:

UITableView fixed

Ответы [ 4 ]

5 голосов
/ 10 февраля 2011

К сожалению, вам придется реализовать эту функцию самостоятельно.Существует множество методов и обратных вызовов, которые необходимо использовать для вычисления высоты строк и меток.Если вам нужна помощь, чтобы начать, я могу изменить этот ответ, чтобы включить пример кода.В противном случае, я уверен, что здесь, в SO или Google, есть несколько связанных вопросов, которые помогут вам начать.В итоге, однако:

  • Определите высоту строки в методе UITableViewDelegate -tableView:heightForRowAtIndexPath:.Вероятно, вам потребуется использовать NSString UIKit Addition методы , чтобы вычислить, какой высоты будет ваша строка с заданным размером шрифта и т. Д. Верните правильную высоту из этого метода делегата.Убедитесь, что ваша метка (в IB или настроена программно) настроена на использование нескольких строк.Если вы установите numberOfLines в 0, метка будет использовать столько строк, сколько необходимо.
  • В вашей UITableViewDataSource реализации -tableView:cellForRowAtIndexPath: вам нужно будет использовать ту же логику, что и раньше, чтобы определитьрамка ваших этикеток.Установите нужный текст, затем измените рамку так, чтобы метка была достаточно высокой, чтобы едва уместить весь текст.
1 голос
/ 10 февраля 2011

Если у вас есть адрес в качестве detailTextLabel, используйте UILabel, который поддерживает столько строк, сколько вам нужно, для адреса должно хватить 3. Вместе с ответом Paul Bently's вы должны хорошо идти.

1 голос
/ 10 февраля 2011

Реализация:

- (float)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath;

в вашей таблице делегат. Для другой строки и раздела в переданном indexPath верните другую высоту, соответствующую размеру вашей метки.

Убедитесь, что для параметра метки в IB не установлено значение (свойство adjustsFontSizeToFitWidth, если сделано с использованием кода).

0 голосов
/ 20 ноября 2012

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

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
     if (indexPath.section == 0 && indexPath.row == 1) {
        NSString *text = [atmAnnotation address];
        UITableViewCell* cell = [tableView dequeueReusableCellWithIdentifier:@"MyIdentifier"];

        cell.textLabel.text = text;
        [cell.textLabel sizeToFit];

        CGFloat height = MAX( 44, cell.textLabel.bounds.size.height );

        return height + CELL_CONTENT_MARGIN * 2;
    }

    return 44.0f;
}

Единственный недостаток - это то, чтоэто приведет к некоторым дополнительным временным выделениям UITableViewCell, но табличное представление немедленно восстановит их, поэтому я не думаю, что это должно быть большой проблемой.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...