UITableView - динамическая высота ячейки, контролируемая самой ячейкой - PullRequest
1 голос
/ 20 декабря 2011

У меня есть следующие настройки: UITableView с пользовательской реализацией UITableViewCell.В каждой ячейке у меня есть UILabel и UIButton.Когда таблица впервые отображается, в каждой из ячеек UILabel имеет число строк, равное 1, и все ячейки имеют фиксированную высоту (в моем случае 60 пикселей).При нажатии кнопки в ячейке число строк UILabel устанавливается в 0 и включается перенос слов, что эффективно расширяет ячейку таблицы.

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

Я не могу получить, может разобраться, как это настроить.Любые идеи приветствуются.

Обновление Вот выдержки из моего кода

В пользовательской реализации UITableViewCell:

- (float)requiredHeight
{
    if(isFull)
    {
        CGSize labelSize = [LblTitle.text sizeWithFont: [LblContent font]
                                     constrainedToSize: CGSizeMake(300.0f, 300.0f) 
                                         lineBreakMode: UILineBreakModeTailTruncation];
        return 42.0f + labelSize.height;
    }
    else
    {
        return 60.0f;
    }
}

В файле владельца (UITableViewDelegate)):

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
    OOCommentCell *cell = (OOCommentCell*)[tableView cellForRowAtIndexPath:indexPath];
    return [cell requiredHeight];
}

Однако это приводит к случайным результатам в бесконечном цикле или в BAD_ACCESS_EXCEPTION.

Ответы [ 2 ]

2 голосов
/ 20 декабря 2011

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

  1. Я создал простой класс, содержащий информацию, относящуюся к одной ячейке:
@interface CommentInfo : NSObject
{
    int ID;
    NSString *Name;
    NSString *Date;
    NSString *Content;
    BOOL IsFull;
    float Height;
}

@property (readonly) int ID;
@property (readonly) NSString *Name;
@property (readonly) NSString *Date;
@property (readonly) NSString *Content;
@property (readwrite, assign) float Height;
@property (readwrite, assign) BOOL IsFull;

- (id)initWithID:(int)_id withName:(NSString *)_name withDate:(NSString *)_date withText:(NSString *)_text;

@end

Не беспокойтесь слишком сильно обо всех свойствах - наиболее важным является Height.

  1. в моем контроллере (которыйЯ также сохраняю данные как NSMutableArray указателей на объекты типа CommentInfo.

  2. В cellForRowAtIndexPath Я получаю соответствующий указатель ипередайте его пользовательской реализации ячейки во время построения, где она хранится.Я также устанавливаю self в качестве делегата ячейки.

  3. В реализации пользовательской ячейки, когда мне нужно увеличить / изменить высоту, я обновляю свойство Height вCommentInfo объект и вызов метода в делегате для обновления отображения.

  4. Когда вызывается этот метод updateDisplay, я просто делаю следующее:

[CommentsTable beginUpdates];
[CommentsTable endUpdates];
  1. В методе heightForRowAtIndexPath я получаю соответствующий указатель на CommentInfo и считываю свойство Height.Поскольку указатель между контроллером и ячейкой одинаков, любые изменения этого свойства будут видны в обоих классах.

Работа выполнена.

0 голосов
/ 20 декабря 2011

Реализуйте метод UITableViewDelegate - tableView: heightForRowAtIndexPath: в делегате таблицы.Если вы хотите определить высоту для каждой ячейки, вы можете «перенаправить» этот вызов в класс ячейки, вызвав свой собственный tableView: cellForRowAtIndexPath: метод в tableView: heightForRowAtIndexPath.

Обновление: реализовано в коде.Ошибка была вызвана неправильной подписью метода в делегате, вызывающем tableView: cellForRowAtIndexPath.

В пользовательской реализации UITableViewCell:

- (CGFloat)requiredHeight
{
    if(isFull)
    {
        CGSize labelSize = [LblTitle.text sizeWithFont: [LblContent font]
                                     constrainedToSize: CGSizeMake(300.0f, 300.0f) 
                                         lineBreakMode: UILineBreakModeTailTruncation];
        return 42.0f + labelSize.height;
    }
    else
    {
        return 60.0f;
    }
}

В файле владельца (UITableViewDelegate):

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
    OOCommentCell *cell = (OOCommentCell*)[self tableView:tableView cellForRowAtIndexPath:indexPath];
    return [cell requiredHeight];
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...