2012-10-31 15 views
15

Ho un UICollectionView all'interno di un UIViewController. Nel metodo collectionView cellForItemAtIndexPath: crea una serie di celle personalizzate basate sull'origine dati. Le celle personalizzate a loro volta contengono un UIView, sottoclasse per disegnare singole pagine PDF.UICollectionView mostra celle errate dopo lo scorrimento - problema di rimozione?

È impostato in modo tale da suddividere un file PDF nelle sue singole pagine, quindi la cella 1 contiene la pagina PDF 1, la cella 2 contiene la pagina PDF 2 e così via. Fin qui tutto bene, ecco il mio problema:

Quando si scorre verso il basso, UICollectionView inizia a visualizzare le celle sbagliate. Ad esempio in un documento di 34 pagine, mostra le celle/pagine 1-16 nell'ordine corretto, ma poi inizia a visualizzare le pagine che sembrano essere state rimosse dal numero, come cella 1, cella 2, cella 4. Non ho mai vai vicino alla cella/pagina 34.

Ho visto un comportamento simile da UITableView in passato, e credo che abbia qualcosa a che fare con il dequeue delle celle o con un metodo delegato. Non del tutto sicuro - ogni aiuto è apprezzato.

- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath { 

//create custom cell 
CustomCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:@"cellID" forIndexPath:indexPath]; 

//set file name (always the same; one PDF file) 
cell.fileName = fileName; 
cell.backgroundColor = [UIColor clearColor]; 

//set the title to the page number 
cell.title = [NSString stringWithFormat:@"page %@", [countArray objectAtIndex:indexPath.row]]; 

//set the current page (which indicates which page to display) according to the pageCount 
cell.currentPage = [[countArray objectAtIndex:indexPath.row] intValue]; 

return cell; } 
+0

Forse ho lo stesso problema. Hai trovato una soluzione? – chris

risposta

14

Ho avuto problemi similare. Questo è più probabile perché le celle riutilizzate non si ridisegnano. In contenuti classe (la visualizzazione PDF) del tuo cellulare personalizzato, innescare ridisegnare se il telaio viene aggiornato:

-(void)setFrame:(CGRect)frame { 
    [super setFrame:frame]; 
    [self setNeedsDisplay]; // force drawRect: 
} 

questo ha funzionato per me. Inoltre, se la dimensione di cella può cambiare, impostare la maschera ridimensionamento automatico in modo da riempire lo spazio con

self.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight; 

durante l'inizializzazione.

+1

Questo ha funzionato per me - grazie per il vostro aiuto. Chiamando il metodo setFrame di cui sopra all'interno di cellForItemAtIndexPath di UICollectionView, forzato i PDF a ridisegnare. Grazie molto. –

+0

Grande! Chiamando 'setFrame:' ​​te stesso probabilmente non è necessario perché la vista della raccolta lo fa comunque. – chris

+0

impostazione della maschera di ridimensionamento assistita, – peko

12

fisso problema simile con il metodo prepareForReuse

basta aggiungere questo metodo per l'implementazione di cella personalizzato

- (void)prepareForReuse { 

    self.fileName = nil; 
    self.title = nil; 

    // add remaining properties 

} 
+0

quando lo chiamo? –

+2

@PuneethKamath non è necessario chiamare questo metodo, basta aggiungere questo nella sottoclasse UICollectionViewCell –

+3

non funziona per me – AndrewK

1

ho risolto un problema simile in rapido in base alla risposta del Asatur Galstyan.

Dopo aver associato una classe personalizzata a una cella in uno storyboard funzione prepareForReuse() può essere ignorato:

import UIKit 

class SomeCollectionViewCell: UICollectionViewCell { 

    @IBOutlet weak var exampleView: UIView! 
    @IBOutlet weak var exampleLabel: UILabel! 

    override func prepareForReuse(){ 
     super.prepareForReuse() 
     exampleLabel.textColor = nil 
     exampleView.backgroundColor = nil 
     exampleView.layer.cornerRadius = 0 
    } 
} 

Ci implementazione predefinita di prepareForReuse() non fa nulla (almeno in iOS 10), ma Apple recommends calling the the super.prepareForReuse() when overriding anyway.

+1

Lavorando dal tuo esempio, ho trovato che 'exampleView.setNeedsDisplay()' all'interno di 'prepareForReuse()' problema risolto. – JKaz

Problemi correlati