2013-10-04 2 views
3

Вот код, который я использую для создания UITableViewCell. Я тестирую iOS6/iOS7. Если я удалю код о UIImageView, свитки UITableView просто прекрасны. Но с UIImageView это отставание и спазмы. Я ищу какое-то решение для исправления отставания. Заранее спасибо.Использование UIImageView с [UIImage resizableImageWithCapInsets] в UITableView вызывает lag

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
    { 
     static NSString *CellIdentifier = @"BubbleCell"; 
     UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier]; 
     UILabel *label; 
     UIImageView *bubbleLeft; 
     UIImageView *bubbleRight; 

     if(cell == nil) 
     { 
     cell = [[ 
    UITableViewCell 
    alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] ; 

      label = [[UILabel alloc] init]; 
      label.tag = 1; 

      NSString *fileLeft = [[NSBundle mainBundle] pathForResource:@"chatBubbleGray.png" ofType:nil]; 
      NSString *fileRight = [[NSBundle mainBundle] pathForResource:@"chatBubbleBlue.png" ofType:nil]; 

    UIImage 
    *bubbleImageLeft = [[ 
    UIImage imageWithContentsOfFile:fileLeft] resizableImageWithCapInsets:UIEdgeInsetsMake(20, 22, 20, 22)]; 

    UIImage 
    *bubbleImageRight = [[ 
    UIImage imageWithContentsOfFile:fileRight] resizableImageWithCapInsets:UIEdgeInsetsMake(20, 22, 20, 22)]; 

      bubbleLeft = [[UIImageView alloc] initWithFrame:CGRectMake(10, 10, 10, 10)]; 
      [bubbleLeft setImage:bubbleImageLeft]; 
      bubbleLeft.tag=2; 
      bubbleRight = [[UIImageView alloc] initWithFrame:CGRectMake(320 - 20, 10, 10, 10)]; 
      [bubbleRight setImage:bubbleImageRight]; 
      bubbleRight.tag=3; 

      [cell addSubview:bubbleLeft]; 
      [cell addSubview:bubbleRight]; 
      [cell addSubview:label]; 

     }else{ 
      label = (UILabel *)[cell viewWithTag:1]; 
      bubbleLeft = (UIImageView *)[cell viewWithTag:2]; 
      bubbleRight = (UIImageView *)[cell viewWithTag:3]; 
     } 


    // set frame to largest size you want 

     label.numberOfLines = 0; 
     label. 
    backgroundColor = [UIColor clearColor]; 
     label. 
    text 
    = [[[ 
    currentDictionary objectAtIndex:indexPath.row] objectForKey:@"string"] stringByReplacingOccurrencesOfString:@"\\n" withString:@"\n"]; 

     CGSize maximumLabelSize = CGSizeMake(296, FLT_MAX); 

     CGSize expectedLabelSize = [label.text sizeWithFont:label.font constrainedToSize:maximumLabelSize lineBreakMode:label.lineBreakMode]; 

     if (indexPath.row%2==0) { 
      bubbleRight.hidden = YES; 
      bubbleLeft.hidden = NO; 
      bubbleLeft.frame = CGRectMake(10, 10, expectedLabelSize.width+20, expectedLabelSize.height+20); 

      label.frame = CGRectMake(
            20, 20, 
            expectedLabelSize.width, expectedLabelSize.height); 

     }else{ 
      bubbleLeft.hidden = YES; 
      bubbleRight.hidden = NO; 

      bubbleRight.frame = CGRectMake(320 - expectedLabelSize.width - 30, 10, expectedLabelSize.width+20, expectedLabelSize.height+20); 

      label.frame = CGRectMake(
            320 - expectedLabelSize.width - 20, 20, 
            expectedLabelSize.width, expectedLabelSize.height); 
     } 



    // Configure the cell... 

     return cell; 
    } 

EDIT:

Далее обзор кода показал, что отстающий на самом деле вызваны этот кусок кода: bubbleLeft.frame = CGRectMake(10, 10, expectedLabelSize.width+20, expectedLabelSize.height+20);

ответ

2

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

UIImage imageWithContentsOfFile:fileLeft] resizableImageWithCapInsets:UIEdgeInsetsMake(20, 22, 20, 22)];

для изображения, которое было

47x36.

Это означает, что мои колпачки шли отрицательно, переворачивая растяжимую часть, вызывающую задержку. В качестве дополнительной информации наилучшая производительность от resizableImageWithCapInsets: может быть достигнута путем размещения растягиваемой области 1px x 1px для изменения размера.

+0

Итак, каковы были значения UIEdgeInset, которые вы использовали для этого? –

+0

это было бы 17,23,17,23 –

+1

@Omer .. Спасибо ... –

1

Одна простая вещь, которую вы можете сделать, это создать свой UIImages с использованием imageNamed:, а не imageWithContentsOfFile:. imageNamed: обычно загружает только изображение с диска, а затем кэширует его, а imageWithContentsOfFile: выйдет на диск каждые раз.

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

+0

А также изображение может быть загружено один раз, поскольку это одно и то же изображение, возможно, в методе 'setup'. – danypata

+0

Изображения загружаются не более 1 раза при создании первых ячеек. Затем они повторно используются, когда ячейки повторно используются. Кроме того, я просто попробовал запустить код снова с помощью 'imageNamed:'. Но результат все тот же. Я снова отладил код, чтобы убедиться, что проблема на самом деле вызвана 'bubbleLeft.frame = CGRectMake (10, 10, expectedLabelSize.width + 20, expectedLabelSize.height + 20);' –

+0

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

Смежные вопросы