У меня есть небольшое приложение, которое перечисляет кучу элементов в базе данных. Если вы щелкнете по одному из элементов, приложение переключится на новое представление, которое покажет вам всю информацию об этом конкретном элементе. Поскольку объем отображаемой информации является динамическим, я делаю это, делая второе представление UITableView и устанавливая размер каждой строки, как это необходимо для конкретного отображаемого объекта. Обычно это работает нормально, но у одного из элементов есть стена текста для последнего отображаемого элемента. Когда я пытаюсь просмотреть информацию об этом конкретном объекте, он ничего не отображает там, где должна быть стена текста.
При дублировании я могу сказать, что текст, который используется для определения размера ячейки и метки, должен быть правильным. Похоже, что он правильно определяет размер (он дает мне высоту 21298 для ячейки и 21294 для метки), и я могу прокрутить вниз, что кажется довольно большой пустой меткой. Тем не менее, дисплей немного запутался, как будто экран обновлялся. Текст в верхней части представления заикается с того места, где он начинался, вплоть до верхней части экрана, а полоса прокрутки с правой стороны также перерисовывается неправильно.
Кто-нибудь видел что-то подобное раньше?
Извините, я не могу опубликовать скриншоты, которые у меня есть, так как мне не хватает представителя
РЕДАКТИРОВАТЬ: разобрался с ответом. Я опубликую его как ответ, как только пройдет минимальное время.
Я нашел обходной путь, если кто-то еще столкнется с этим.
После недолгих поисков я обнаружил, что когда длина строки источника достигает примерно 41000, она начинает вызывать эту ошибку рисования. Поэтому я разделил любую строку на ~ 30 000 и добавил несколько строк в таблицу. Теперь он отображает всю стену текста.
Код:
#define FONT_SIZE 14.0f
#define CELL_CONTENT_WIDTH 320.0f
#define CELL_CONTENT_MARGIN 2.0f
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
//static NSString *CellIdentifier = @"Cell";
NSString *CellIdentifier = [NSString stringWithFormat:@"Cell%d", [indexPath row]];
UILabel *label = nil;
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil)
{
cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease];
label = [[UILabel alloc] initWithFrame:CGRectZero];
[label setLineBreakMode:UILineBreakModeWordWrap];
[label setMinimumFontSize:10.0];
[label setNumberOfLines:0];
[label setFont:[UIFont systemFontOfSize:FONT_SIZE]];
[label setTag:1];
if ([indexPath row] == 1 || [indexPath row] == 2)
{
[label setTextColor:[UIColor redColor]];
}
else if ([indexPath row] == 3)
{
[label setTextColor:[UIColor colorWithRed:0.0f green:150.f/255.f blue:30.f/255.f alpha:1.0f]];
}
else if ([indexPath row] == 5)
{
[label setTextColor:[UIColor colorWithRed:155.f/255.f green:145.f/255.f blue:0.0f alpha:1.0f]];
}
[[cell contentView] addSubview:label];
}
NSString *text = [cardInfo objectAtIndex:[indexPath row]];
CGSize constraint = CGSizeMake(CELL_CONTENT_WIDTH - (CELL_CONTENT_MARGIN *2), 20000000000000.0f);
CGSize size = [text sizeWithFont:[UIFont systemFontOfSize:FONT_SIZE] constrainedToSize:constraint lineBreakMode:UILineBreakModeWordWrap];
if (!label)
{
label = (UILabel *)[cell.contentView viewWithTag:1];
}
[label setText:text];
[label setFrame:CGRectMake(CELL_CONTENT_MARGIN, CELL_CONTENT_MARGIN, CELL_CONTENT_WIDTH - (CELL_CONTENT_MARGIN *2), MAX(size.height, 30.0f))];
// Configure the cell...
return cell;
}
- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
NSString *text = [cardInfo objectAtIndex:[indexPath row]];
CGSize constraint = CGSizeMake(CELL_CONTENT_WIDTH - (CELL_CONTENT_MARGIN *2), 20000000000000.0f);
CGSize size = [text sizeWithFont:[UIFont systemFontOfSize:FONT_SIZE] constrainedToSize:constraint lineBreakMode:UILineBreakModeWordWrap];
CGFloat height = MAX(size.height, 30.0f);
return height + (CELL_CONTENT_MARGIN * 2);
}