2010-07-14 4 views
14

Tengo un UITableView con celdas personalizadas que se definieron en el archivo xib, y estoy experimentando un pobre rendimiento de desplazamiento (entrecortado) en mi dispositivo cuando las celdas tienen un UISegmentedControl en ellas. Las declaraciones NSLog revelan que las celdas se están asignando y reutilizando como deberían. Mi código para el método cellForRowAtIndexPath está debajo. Las conexiones se realizan en el xib según la documentación de Apple. (Se desplaza sin problemas en el simulador por cierto)¿Por qué el rendimiento del desplazamiento es deficiente para celdas de vista de tabla personalizadas que tienen objetos UISegmentedControl?

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

    static NSString *MyIdentifier = @"MyIdentifier"; 

    UITableViewCell *cell = 
      [tableView dequeueReusableCellWithIdentifier:MyIdentifier]; 

    if (cell == nil) 
    { 
     [[NSBundle mainBundle] loadNibNamed:@"TableViewCell" 
           owner:self 
           options:nil]; 
     cell = self.tvCell; 
     self.tvCell = nil; 
    } 

    cell.layer.shouldRasterize = YES;  // build error is here 

    UILabel *lbl = (UILabel *)[cell viewWithTag:1]; 

    [lbl setText:[NSString stringWithFormat:@"Q%i", indexPath.row+1]]; 

    return cell; 
} 

Respuesta

46

Cualquier dibujo que una celda de tabla tiene que hacer mientras se está desplazando va a causar problemas de rendimiento; cuando tienes muchas subvistas, tiende a haber un montón de dibujos, y eso, como habrás observado, hace que el desplazamiento sea bastante irregular. Hay un par de formas de tratar de reducir eso.

El primer paso es asegurarse de que sus propias celdas, y tantas de sus subvistas como sea posible, tengan sus propiedades opaque establecidas en YES. Las vistas opacas no tienen que mezclarse con el contenido debajo de ellas, y eso ahorra mucho tiempo.

También es posible que desee establecer capas de sus células a rasterizar sí mismos, como esto:

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

Esto cerrará su jerarquía de vistas en un solo mapa de bits plana, que es el tipo de cosas Core Animation le encanta dibujar. Tenga en cuenta que cualquier animación de puntos de vista-indicadores de actividad, por ejemplo, forzará que el mapa de bits se actualice cada vez que cambian, es decir, mucho. En ese caso, no querrás que la celda rastrille todo; puede usar una subvista con todas sus vistas relativamente estáticas (por ejemplo, etiquetas) debajo de otra subvista con dicho contenido dinámico, y solo tener la primera de esas rasterizadas.

+0

Noah, después de agregar la primera línea de código que sugirió y luego también agregar el marco QuartzCore para poder referirme a la capa, obtengo error de compilación: "solicitud de miembro 'shouldRasterize' en algo que no es una estructura o unión" . ¿Podría decirnos más sobre lo que se requiere para que esas dos líneas de código funcionen? – Alyoshak

+3

Ese error podría aparecer si no tiene #import en su .m; Además, shouldRasterize solo está disponible en iOS 3.2 y versiones posteriores. –

+0

Sí se importó en mi archivo .m y también . Pero, no, no usando 3.2 (usando 3.1.3). Debe ser el problema. Sí, y ni siquiera puedo construir con éxito este dispositivo (iPodTouch) con iOS 3.2. Error de firma de código y otro extraño con respecto a iOS 3.2. Ambos están aquí: [BEROR] Error de CodeSign: se requiere la firma de código para el tipo de producto 'Aplicación' en SDK 'Dispositivo - iPhone OS 3.2' Advertencia [BWARN]: compilación con 'Familia de dispositivos orientados' configurada solo para iPhone ('1 ') no compatible con SDK' Dispositivo - iPhone OS 3.2 '. – Alyoshak

3

Asegúrate de que tu identificador sea 'MyIdentifier' en el xib. Obtendrás un buen golpe de rendimiento si no lo es. Supongo que 'asignados y reutilizados como deberían' significa unos asignados en el inicio y no más asignados después. Si eso es cierto, entonces probablemente ya estás listo.

Otra forma de mejorar el rendimiento es construir su vista de tabla con el código. Es mucho más rápido que usar xib. Cuando construyo vistas de tabla, generalmente las construyo en IB, luego copio los valores de marco en código y construyo en código.

Dedique algo de tiempo para ver los videos de rendimiento de la WWDC 2010. Mucha información excelente, aprendo algo nuevo cada vez que los veo.

Cuestiones relacionadas