UICollectionview Desplazamiento entrecortado al cargar celdas

Tengo una galería en mi aplicación que utiliza una UICollectionView . Las celdas tienen un tamaño aproximado de 70,70. Estoy usando ALAssets de ALAssetLibrary en la galería que he almacenado en una list.

Estoy usando el patrón habitual para poblar las celdas:

 -(UICollectionViewCell*)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath { mycell = [collectionView dequeueReusableCellWithReuseIdentifier:cellIdentifier forIndexPath:indexPath]; mycell.imageView.image = [[UIImage imageWithCGImage:[alassetList objectAtIndex:indexpath.row] thumbnail]]; return mycell; } 

Mi galería está desplazándose entrecortada. No entiendo por qué esto es así. He intentado agregar un NSCache para almacenar en caching las imágenes en miniatura (pensar que tal vez crear las imágenes era caro), pero esto no ayudó para el performance.

Espero que la interfaz de usuario sea tan mantisa como la aplicación de stock.

Ahora estoy sospechando que puede ser algo en UICollectionViewCell prepareForReuse que puede estar dequeueReusableCellWithReuseIdentifier método dequeueReusableCellWithReuseIdentifier pero utilizando instrumentos que no pude encontrar.

¿Alguna otra cosa que pueda estar causando esto? ¿Existe una forma "más rápida" de preparar el UICollectionViewCell o de dequeue de forma más rápida?

Entonces, cualquiera que tenga problemas de desplazamiento debe hacer esto

agrega estas 2 líneas después de tu dequeue

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

Supongo que el "choppyness" viene de la asignación UIImage, no nada con el método dequeueReusableCellWithReuseIdentifier . Intentaría hacer la asignación de imágenes en un hilo de background y ver si eso hace que las cosas sean un poco más mordaces.

 -(UICollectionViewCell*)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath { mycell = [collectionView dequeueReusableCellWithReuseIdentifier:cellIdentifier forIndexPath:indexPath]; dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0), ^(void) { // Load image on a non-ui-blocking thread UIImage *image = [[UIImage imageWithCGImage:[alassetList objectAtIndex:indexpath.row] thumbnail]]; dispatch_sync(dispatch_get_main_queue(), ^(void) { // Assign image back on the main thread mycell.imageView.image = image; }); }); return mycell; } 

Se pueden encontrar más detalles aquí: https://developer.apple.com/library/ios/documentation/Cocoa/Conceptual/Multithreading/Introduction/Introduction.html

Cargue sus imágenes usando NSORLConnection's sendAsynchronousRequest:queue:completionHandler:

 NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString:urlString]]; [NSURLConnection sendAsynchronousRequest:request queue:[NSOperationQueue mainQueue] completionHandler:^(NSURLResponse *response, NSData *data, NSError *error) { [cell.imageView setImage:[UIImage imageWithData:data]]; }]; 

Marque en subvisualizaciones de clip y opaco en el inspector de attributes y marque la habilitación habilitada.

Si alguien está usando PhImageManager, desactivar síncrono resolvió el problema. (deliveryMode = .FastFormat también puede proporcionar una mejora de performance adicional, pero la compensación es que la miniatura será de menor calidad)

  let option = PHImageRequestOptions() option.deliveryMode = .Opportunistic option.synchronous = false PHImageManager().requestImageForAsset(phAsset, targetSize: CGSizeMake(2048, 2048), contentMode: .AspectFit, options: option, resultHandler: { (image, objects) in self.imageView.image = image! }) 

Tuve problemas con el desplazamiento de UICollectionView .

Lo que me funcionó (casi) como un hechizo: rellené las celdas con miniaturas png 90×90. Digo casi porque el primer desplazamiento completo no es tan suave, pero nunca más se rompió …

En mi caso, el tamaño de celda es 90×90.

Tenía muchos tamaños png originales antes, y estaba muy entrecortado cuando el tamaño original png era mayor a ~ 1000×1000 (muchos crashs en el primer desplazamiento).

Así que selecciono 90×90 (o similar) en UICollectionView y UICollectionView los UICollectionView originales (sin importar el tamaño). Espero que esto ayude a los demás.