UITablview текст ячейки перемещается самостоятельно? - PullRequest
1 голос
/ 17 июля 2010

Я создаю ячейку UITableview следующим образом

const NSInteger TOP_LABEL_TAG = 1001;

UILabel *topLabel;

static NSString *CellIdentifier = @"Cell";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil)
{

    cell =[[[UITableViewCell alloc] initWithFrame:CGRectZero             reuseIdentifier:CellIdentifier]
     autorelease];

    UIImage *indicatorImage = [UIImage imageNamed:@"indicator.png"];

     cell.accessoryView =[[[UIImageView alloc] initWithImage:indicatorImage]
     autorelease];

   const CGFloat LABEL_HEIGHT = 25;

    UIImage *image = [UIImage imageNamed:@"64x64.png"];

      topLabel =[[[UILabel alloc] initWithFrame:CGRectMake(
                 image.size.width + 2.0 * cell.indentationWidth,
                 0.8 * (tableView.rowHeight - 1.7 * LABEL_HEIGHT),
                 tableView.bounds.size.width -
                 image.size.width - 4.0 * cell.indentationWidth
                 - indicatorImage.size.width,
                 LABEL_HEIGHT)] autorelease];

    [cell.contentView addSubview:topLabel];


        topLabel.tag = TOP_LABEL_TAG;

    topLabel.textColor = [UIColor colorWithRed:0.25 green:0.0 blue:0.0 alpha:1.0];
    topLabel.highlightedTextColor = [UIColor colorWithRed:1.0 green:1.0 blue:0.9 alpha:1.0];

    topLabel.font = [UIFont systemFontOfSize:20];
    topLabel.textAlignment== UITextAlignmentCenter;

}

else
{

    topLabel = (UILabel *)[cell viewWithTag:TOP_LABEL_TAG];
}   

topLabel.text =  [NSString stringWithFormat:[aboutArray objectAtIndex:[indexPath row]]];
topLabel.textAlignment=UITextAlignmentCenter;

в первый раз, когда таблица загружает tableView, работает нормально. Но когда я возвращаюсь на эту страницу с другой страницы, текст в первой ячейкестола движется вправо и видна только половина его ... Что может быть причиной этого ??

1 Ответ

1 голос
/ 17 июля 2010

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

Для начала, я думаю, вы, возможно, предполагаете, что в ячейке многократного использования из резервной копии есть те же данные, что и при получении.назад.На самом деле это работает так: вы можете вернуть одну и ту же ячейку, но, вероятно, вы получите другую ячейку, которая остается сверху или снизу в зависимости от направления прокрутки.Поскольку ячейки выходят из поля зрения, они помечаются как повторно используемые в непредсказуемом порядке.Итак, удалите этот блок else и переместите всю логику (кроме init + autorelease за пределы блока if). Таким образом, все, что вы действительно проверяете, это то, нужно ли выделять новую память.

Во-вторых, у вас есть == UITextAlignmentCenter, вы, вероятно, хотите использовать =

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

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

// initialize cell if need be
static NSString *CellIdentifier = @"Cell";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil) {
  cell = [[[UITableViewCell alloc] initWithFrame:CGRectZero reuseIdentifier:CellIdentifier] autorelease];
}

// setup the accessory
UIImage *indicatorImage = [UIImage imageNamed:@"indicator.png"];
cell.accessoryView = [[[UIImageView alloc] initWithImage:indicatorImage] autorelease];


// TODO: rewrite this 
UIImage *image = [UIImage imageNamed:@"64x64.png"];
const CGFloat LABEL_HEIGHT = 25;
CGFloat x = image.size.width + 2.0 * cell.indentationWidth;
CGFloat y = 0.8 * (tableView.rowHeight - 1.7 * LABEL_HEIGHT);
CGFloat w = tableView.bounds.size.width - image.size.width - 4.0 * cell.indentationWidth - indicatorImage.size.width;
CGFloat h = LABEL_HEIGHT;
CGRect labelFrame = CGRectMake(x,y,w,h);

// build a label and use it as the content view
UILabel* topLabel = [[[UILabel alloc] initWithFrame:labelFrame] autorelease];
topLabel.textColor = [UIColor colorWithRed:0.25 green:0.0 blue:0.0 alpha:1.0];
topLabel.highlightedTextColor = [UIColor colorWithRed:1.0 green:1.0 blue:0.9 alpha:1.0];
topLabel.font = [UIFont systemFontOfSize:20];
topLabel.textAlignment = UITextAlignmentCenter;
topLabel.text = [NSString stringWithFormat:[aboutArray objectAtIndex:[indexPath row]]];
topLabel.textAlignment = UITextAlignmentCenter;

[cell.contentView addSubview:topLabel];
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...