2011-11-30 12 views
5

Tengo el siguiente código para agregar un color de borde y sombra paralela al fondo de mi UITableViewCell. Mi problema es que este código causa un gran retraso en el TableView.UITableView Retraso debido a sombras y bordes

¿Puede decirme cómo puedo optimizar mi código, evitando el retraso de UITableView?

if ([cell viewWithTag:012] == nil && comment.isReply == NO) { 
    UIImageView *iv = [[[UIImageView alloc] initWithFrame:frame] autorelease]; 
    [iv setImage:[UIImage imageNamed:@"paper"]]; 
    [iv setTag:012]; 
    [cell insertSubview:iv atIndex:0]; 

    [iv.layer setBorderWidth:1.0]; 
    [iv.layer setBorderColor:[[UIColor whiteColor] CGColor]]; 

    [iv.layer setShadowColor:[[UIColor blackColor] CGColor]]; 
    [iv.layer setShadowOffset:CGSizeMake(0, 1)]; 
    [iv.layer setShadowOpacity:0.75]; 

} 

else if ([cell viewWithTag:012] == nil && comment.isReply == YES) { 

    frame.origin.x += 35; 

    UIImageView *iv = [[[UIImageView alloc] initWithFrame:frame] autorelease]; 
    [iv setImage:[UIImage imageNamed:@"paper"]]; 
    [iv setTag:012]; 
    [cell insertSubview:iv atIndex:0]; 

    UIImage *arrow = [UIImage imageNamed:@"arrow"]; 
    UIImageView *ivs = [[[UIImageView alloc] initWithFrame:CGRectMake(-12, ([cell frame].size.width/2) + ([arrow size].width/2) , arrow.size.width, arrow.size.height)] autorelease]; 
    [cell addSubview:ivs]; 

    [iv.layer setBorderWidth:1.0]; 
    [iv.layer setBorderColor:[[UIColor whiteColor] CGColor]]; 

    [iv.layer setShadowColor:[[UIColor blackColor] CGColor]]; 
    [iv.layer setShadowOffset:CGSizeMake(0, 0)]; 
    [iv.layer setShadowOpacity:0.75]; 

} 
+0

¿Dónde está exactamente agregando las sombras? Quiero decir, ¿lo haces en la fuente de datos UITableView? Si es así, deberías buscar crear una subclase UITableViewCell personalizada y hacer la interfaz de usuario personalizada allí. –

+0

Lo siento, no lo dejé claro, eso está en el método cellForRowAtIndexPath. –

Respuesta

1

Debe evitar manipular la celda en cada carga, en su lugar debe ajustar la interfaz de usuario cuando la celda se inicializa/crea.

Para ilustrar, cada vez que se desplaza una nueva celda (o varias) podría cargarse utilizando el método cellForRowAtIndexPath:, actualmente está haciendo muchos cambios de vista en este método, pero podría haber casos en que esto no sea necesario (por ejemplo, la nueva celda es del mismo tipo que la que acaba de desplazarse fuera de la pantalla). Mueva esta modificación de la interfaz de usuario a donde se inicializa la celda, no donde se intercambian los datos. Podrías hacer esto con una subclase o simplemente así.

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { 
    // Reuse id 
    static NSString *identifier1 = @"identifer-1"; 
    static NSString *identifier2 = @"identifier-2"; 
    static NSString *regular = @"regular"; 

    UITableViewCell *cell; 

    if (comment.isReply == NO) { 
     cell = [tableView dequeueReusableCellWithIdentifier: identifier1]; 

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

      // Do the UI modification here 
     } 
    } else if (comment.isReply == YES) { 
     cell = [tableView dequeueReusableCellWithIdentifier: identifier2]; 

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

      // Do the UI modification here 
     } 
    } else { 
     // Regular cell 
     cell = [tableView dequeueReusableCellWithIdentifier: regular]; 

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

    // Load the data into the cell 

    return cell; 
} 

Esperanza usted consigue a dónde voy con esto, la clave está en hacer cosas pesadas lo menos posible y dejar que el almacenamiento en caché UITableView tiene un efecto mayor.

20

Además de los otros consejos de optimización aquí, la especificación de shadowPath en su CALayer mejorará el rendimiento del dibujo en la sombra. Se podría determinar una ruta para la sombra con algo como esto ...

iv.layer.shadowPath = [UIBezierPath bezierPathWithRect:iv.bounds].CGPath; 

También es posible que desee ver en la shouldRasterize poco en CALayer. Esto hace que la capa se preproduzca como un mapa de bits. Asegúrese de proporcionar también una rasterizaciónScale que coincida con su dispositivo si realiza esta ruta.

cell.layer.shouldRasterize = YES; 
cell.layer.rasterizationScale = [UIScreen mainScreen].scale; 
+1

Echa un vistazo a esta gran [publicación de blog] (http://nachbaur.com/blog/fun-shadow-effects-using-custom-calayer-shadowpaths) con algunos shadowPaths diferentes que puedes usar –

+1

muchas gracias por este consejo sobre la rasterización ! hice el truco para mí;) ahora mi mesa se desplaza tan suavemente ^^ – polo987

+0

¡OMG, GRACIAS! Lo siento, solo puedo votarte una vez. –

Cuestiones relacionadas