28

Ho una galleria nella mia app che utilizza uno UICollectionView. Le celle hanno una dimensione di circa 70,70. Sto usando ALAssets da ALAssetLibrary nella galleria che ho memorizzato in una lista.UICollectionview Scorrimento continuo quando si caricano le celle

Sto usando il solito schema per la compilazione delle celle:

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

La mia galleria scorre mosso. Non capisco perché sia ​​così. Ho provato ad aggiungere un NSCache per mettere in cache le immagini in miniatura (pensando che forse la creazione delle immagini fosse costosa), ma questo non ha aiutato le prestazioni.

Mi aspetto che l'interfaccia utente sia burrosa come l'app di riserva.

Attualmente sospetto che potrebbe esserci qualcosa nel UICollectionViewCell prepareForReuse che potrebbe trattenere il metodo dequeueReusableCellWithReuseIdentifier ma utilizzando strumenti che non sono riuscito a trovare.

Qualsiasi altra cosa potrebbe causare questo? Esiste un modo "più veloce" per preparare lo UICollectionViewCell o lo dequeue in modo più rapido?

+1

Utilizzando gli strumenti, hai individuato una chiamata al metodo che ha richiesto troppo tempo? Per esempio. 0,02 secondi per riutilizzare una cella è troppo per uno scorrimento regolare. –

+0

Sì. Dopo averlo fatto, ho visto il metodo [uicollectionview updatevisiblecellsnow] chiamato tonnellate di volte. Cerca su Google questo problema e arriva a questa domanda http://stackoverflow.com/questions/16336772/uicollectionview-performance-updatevisiblecellsnow. –

+0

Provare a spostare alcune delle funzioni relative alla visualizzazione della cella al metodo willDisplayCell della vista dell'insieme e altre al metodo didEndDisplayingCell. –

risposta

89

Quindi chiunque abbia problemi di scorrimento dovrebbe fare this

aggiungere queste 2 righe dopo il vostro dequeue

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

Spiacente, cosa devo fare? Il tuo link punta a una pagina con molti e molti contenuti. Devo leggere tutto questo se ho ++ qualsiasi problema di scorrimento ++ o solo se è laggoso? –

+0

Non sono sicuro di quale sia il tuo problema. Puoi indicarmi la tua domanda, ma nel mio caso si scopre che UICollectionView stava causando il rallentamento e il mio codice stava effettivamente andando bene, nel mio caso forzare il livello della cella a raster ha risolto il problema.In altri casi puoi provare a usare l'istante temporale in XCode per capire la lentezza. codice di sistema. –

+0

In breve, prova ad aggiungere le 2 righe che ho inviato al tuo metodo cellforitematindexpath dopo aver eliminato la cella e verificato se ti aiuta. –

0

Ho avuto problemi con UICollectionView scorrimento.

Ciò che ha funzionato (quasi) come un incantesimo per me: ho popolato le celle con miniature png 90x90. Dico quasi perché la prima scroll completa non è così liscia, ma non si è mai più fermata ...

Nel mio caso, la dimensione della cella è 90x90.

Avevo molte dimensioni originali di png prima, ed era molto mosso quando la dimensione originale del png era maggiore di ~ 1000x1000 (molti arresti anomali al primo scorrimento).

Quindi seleziono 90x90 (o qualcosa di simile) su UICollectionView e visualizzo i png originali (indipendentemente dalle dimensioni). Spero che questo aiuti gli altri.

8

caricare le vostre immagini utilizzando del 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]]; 
}]; 
19

Vorrei assumere la "choppyness" sta venendo dalla ripartizione UIImage, non nulla con il metodo dequeueReusableCellWithReuseIdentifier NSURLConnection. Proverei a fare l'allocazione dell'immagine su un thread in background e vedere se questo rende le cose un po 'più burrose.

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

Maggiori dettagli possono essere trovati qui: https://developer.apple.com/library/ios/documentation/Cocoa/Conceptual/Multithreading/Introduction/Introduction.html

1

Tick su subviews di clip e opachi attributi di ispezione e spuntare paging abilitato.

0

Se qualcuno utilizza PhImageManager, la disattivazione sincrona ha risolto il problema. (deliveryMode =.FastFormat può anche migliorare ulteriormente le prestazioni, ma il compromesso è la miniatura sarà di minore qualità)

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! 
    })