ios objective-c uicollectionview uicollectionviewcell xcode-instruments

ios - UICollectionview Desplazamiento entrecortado al cargar celdas



objective-c uicollectionviewcell (6)

Cargue sus imágenes usando sendAsynchronousRequest de 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]]; }];

Tengo una galería en mi aplicación que utiliza 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 lista.

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 se está desplazando entrecortada. No entiendo por qué esto es. He intentado agregar un NSCache para almacenar en caché las imágenes en miniatura (pensando que tal vez crear las imágenes era costoso) pero esto no ayudó al rendimiento.

Esperaría que la UI fuera tan mantecosa como la aplicación de stock.

Ahora estoy sospechando que puede haber algo en el UICollectionViewCell prepareForReuse que puede estar sosteniendo el método dequeueReusableCellWithReuseIdentifier , pero al usar instrumentos no pude encontrar esto.

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


Entonces, cualquiera que tenga problemas de desplazamiento debería hacer this

agregue estas 2 líneas después de su dequeue

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


Marque las subvistas de clips y opaque en el inspector de atributos y marque la paginación habilitada.


Si alguien está usando PhImageManager, apagar sincrónico solucionó el problema. (deliveryMode = .FastFormat también puede proporcionar una mejora de rendimiento 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! })


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

-(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; }

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


Tuve problemas con el desplazamiento de UICollectionView .

Lo que funcionó (casi) como un encanto para mí: llené las celdas con miniaturas PNG 90x90. Digo casi porque el primer rollo completo no es tan suave, pero nunca se colgó ...

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

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

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