versiones ultima todos reciente para numero mas lista aƱos actualizaciones ios iphone objective-c ios5 ios7

ultima - numero de versiones de ios



objetivo c UITableView no se desplaza suavemente con una celda personalizada y vistas (5)

Quiero que la vista de tabla muestre varias imágenes en cada fila que se puede desplazar. Para esto estoy usando UITableView y Custom UITableViewCell , en la celda personalizada de TableView estoy generando vista de desplazamiento con múltiples vistas e imágenes, así que cuando estoy desplazando la tabla, no se desplaza suavemente parpadeando. ¿Alguien puede sugerirme que haga esto de una mejor manera?

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { // Products table view. ProductCustomCell *cell = (ProductCustomCell *)[tableView dequeueReusableCellWithIdentifier:@"CatelogCell"] ;//] forIndexPath:indexPath]; if (cell == nil) { cell = [[ProductCustomCell alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"CatelogCell"]; } cell.productCellDelegate = self; [cell initProperties]; [cell showProductsInScroll:catelogBundle]; }


Creo que el problema puede ser que pueda estar asignando objetos en el método de delegado cellForRowAtIndexPath de UITableView. Entonces, en lugar de asignar cualquier tipo de objeto, asigne en su clase ProductCustomCell o créelo en su archivo xib.


si desea desplazar la vista de tabla suavemente, hay varios consejos que debe prestar atención.

  1. Guarde en caché la altura de las filas (la vista de tabla puede solicitarlo con frecuencia), en realidad este punto no es el punto clave para bloquear su desplazamiento de vista de tabla.

  2. Cree una memoria caché utilizada menos recientemente para las imágenes utilizadas en la tabla (e invalide todas las entradas inactivas cuando reciba una advertencia de memoria): puede usar SDWebImage para descargar imágenes y almacenarlas en caché. Y a veces, es posible que desee almacenar en caché algunas imágenes que su tabla de vista utiliza con frecuencia y estas imágenes también podrían no liberarse, incluso si recibe una advertencia de memoria si su vista actual es la vista superior.

  3. Dibuje todo en drawRect: UITableViewCell drawRect: si es posible, evite las subvistas a toda costa (o si necesita la funcionalidad de accesibilidad estándar, drawRect: la vista de contenido drawRect: - podría ahorrar algo de costo, pero también le puede costar más tiempo codificar y quizás códigos difíciles de mantener. Pero es realmente bueno utilizar menos vistas en uitableviewcell, que mejorará su rendimiento.

  4. Haz que la UITableViewCell tu UITableViewCell opaca (lo mismo ocurre con la vista de contenido si tienes una): usa la capa opaca lo menos posible.

  5. Use la funcionalidad reutilizable de UITableView como lo recomiendan los ejemplos / documentación de UITableView : debe seguir estos consejos.

  6. Evite degradados / efectos gráficos complicados que no estén UIImage en UIImage s, como el punto 4.

por supuesto, la mayoría del tiempo, si su desplazamiento de la vista de tabla no es uniforme, el problema principal es que carga la imagen en sincronización.

es realmente bueno usar instrumentos para probar el rendimiento.


Probablemente ya hayas encontrado una solución para tu problema, pero si sigues buscando, esto funcionó para mí. También estoy trabajando en una aplicación que implica mostrar muchas imágenes en varias celdas de tabla.

Descubrí que el método cellForRowAtIndexPath se llama prácticamente cada vez que la aplicación carga una nueva celda en la pantalla que aún no se muestra, por lo que cada vez que se desplaza hacia arriba o hacia abajo a las nuevas celdas, este método sigue llamándose aunque algunas de las las celdas estaban en la pantalla antes de que se desplazara a una posición diferente.

Lo que hice fue guardar celdas y sus correspondientes paths de índice que se inicializaron por primera vez en una matriz y cuando se llama nuevamente al método cellForRowAtIndexPath , compruebe si esta celda ya se inicializó comprobando si la ruta de índice está almacenada en mi matriz de indexpaths.

@implementation MyViewController{ NSMutableArray *cells; NSMutableArray *indexpaths; } ... - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{ // check if in array if ([indexpaths containsObject:indexPath]){ return cells[indexPath.row]; } // otherwise, create a new one UITableViewCell *cell = [[UITableViewCell alloc] init]; // customizing cell // other stuff ... // finally save the cell and indepath for checking later [cells addObject:cell]; [indexpaths addObject:indexPath]; return cell; }


Me gustaría agregar un método simple además de la respuesta de TinyMonk. Si realiza una vista única usando una celda personalizada, asegúrese de que la opción de subvista de clip esté marcada correctamente para la tabla y la celda personalizada. Funcionó para mí


Basado en la solución de Leo Chan, lo he actualizado para Swift3.

var manualCells = NSMutableArray() override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { // check if in array if manualCells.contains(indexPath) { return manualCells.object(at: indexPath.row) as! UITableViewCell } let cell = self.tableViewReference.dequeueReusableCell(withIdentifier: "mainIdentifier") as! YourTableViewCell // fill the cell... manualCells.insert(cell, at: indexPath.row) return cell }

Tenga en cuenta que esto es para tablas que contienen una sección.