UITableViewCell с действительно длинным текстом - PullRequest
2 голосов
/ 23 ноября 2011

Я хотел бы создать часть приложения в блоге, используя UITableView.Таблица должна иметь два раздела и сгруппированный стиль.Первый раздел - это блог, а второй раздел таблицы - комментарии.Блоги могут быть любого размера.При вводе большого количества текста, под этим я подразумеваю 10 тысяч слов или более со ссылками и / или фотографиями, приложение вылетает или не отображает текст вообще.Комментарии также могут содержать большое количество текста, а также ссылки и фотографии.Кажется, что UITableView имеет свои ограничения.Вот проблемы, с которыми я сталкиваюсь:

  1. Память
  2. Не всегда отображается весь текст (если он слишком длинный)
  3. Запаздывания прокрутки

Есть идеи, как этого добиться?Должен ли я попытаться создать собственную таблицу с UITextViews, чтобы попытаться имитировать поведение UITableView?Есть ли простой способ реализовать это с помощью Apple UITableView?Я не видел приложение, которое делает это.Любой код, который может помочь мне начать?Я также должен использовать NSAttributedString для форматирования текста.

ОБНОВЛЕНИЕ: При чтении документации для tableView:heightForRowAtIndexPath: обнаружена важная заметка, которая отвечает на вопрос, но не моя проблема.

Важно. Из-за базовой детализации реализации не следует возвращать значения, превышающие 2009.

Ответы [ 2 ]

1 голос
/ 23 ноября 2011

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

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

Вот код, который поможет вам отобразить весь текст без головной боли при прокрутке.

Предполагается, что blogArray - это массив, содержащий текст, который вы хотите отобразить в ячейке. (Замените его собственным).

- (UITableViewCell *)tableView:(UITableView *)tbleView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{

    static NSString *CellIdentifier = @"Cell";

    UITableViewCell *cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease];
        if([self.blogArray count]>0)
    {
    CGSize labelsize;
    UILabel *blogTextLabel = [[UILabel alloc] init];;
    [blogTextLabel setNumberOfLines:0];
    [blogTextLabel setBackgroundColor:[UIColor clearColor]];
    NSString *text=[self.blogArray objectAtIndex:indexPath.row];
    [blogTextLabel setFont:[UIFont fontWithName:@"Helvetica"size:14]];
    labelsize=[text sizeWithFont: blogTextLabel.font constrainedToSize:CGSizeMake(268, 2000.0) lineBreakMode:UILineBreakModeWordWrap];
    blogTextLabel.frame=CGRectMake(10, 24, 268, labelsize.height);
    blogTextLabel.text=text;
    [cell.contentView addSubview: blogTextLabel];
    [blogTextLabel release];


    }
    else {
    }

    [cell setSelectionStyle:UITableViewCellSelectionStyleNone];

    return cell;
}

Вам также необходимо настроить высоту ячейки табличного представления: -

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

{
    CGSize labelsize;
    UILabel * textDesc1 = [[UILabel alloc] init];
    [textDesc1 setNumberOfLines:0];
    textDesc1.text=[self.blogArray objectAtIndex:indexPath.row];
    [textDesc1 setFont:[UIFont fontWithName:@"Helvetica" size:14.0]];
    labelsize=[textDesc1.text sizeWithFont:textDesc1.font constrainedToSize:CGSizeMake(268, 2000.0) lineBreakMode:UILineBreakModeWordWrap];
    labelsize.height=labelsize.height+35;
    [textDesc1 release];
    return (CGFloat)labelsize.height; 


} 
0 голосов
/ 23 ноября 2011

Убедитесь, что вы повторно используете ячейки внутри вашего cellForRowAtIndexPath: метода источника данных. Это должно гарантировать, что прокрутка не запаздывает. Если он продолжает отставать, убедитесь, что вы не блокируете основной поток при рисовании своих ячеек. Кроме того, вы можете использовать такие свойства, как adjustsFontSizeToFitWidth и lineBreakMode в UILabel, чтобы контролировать, сколько текста появляется в любой момент времени.

Убедитесь, что вы автоматически высвобождаете любые клетки, которые alloc в cellForRowAtIndexPath: тоже.

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