2012-10-01 10 views
10

Sto utilizzando UICollectionView a livello di codice.UICollectionView con FlowLAyout che non scorre quando si impostano gli inserti di sezione

ho impostato è telaio come segue:

UICollectionView *collectionView = [[UICollectionView alloc] initWithFrame:CGRectMake(0, 100, self.view.frame.size.width, 3000) collectionViewLayout:flowLayout]; 

mio UICollectionViewFlowLayout ha un inserto sezione impostato come:

flowLayout.sectionInset = UIEdgeInsetsMake(20.0, 20.0, 100.0, 20.0); 

ho anche solo 1 sezione.

Ho impostato l'altezza su 3000 per vedere se la vista della raccolta si scorre ma non lo fa. Lo sto impostando in quanto la vista dell'insieme non sembra scorrere in alto o in basso quando inserisco nuovi elementi.

UICollectionView è sottoclasse da UIScrollView, il che significa che è possibile continuare a reimpostare la dimensione del contenuto della vista di scorrimento. Funzionerebbe correttamente?

L'unico problema è che ciò funzionerebbe se conosco le dimensioni di tutte le voci compreso il numero di elementi presenti su ogni riga.

Se ogni articolo avesse una dimensione diversa, come potrei scoprire la dimensione di ogni riga? Avrei bisogno di aggiungere tutte le dimensioni delle righe e aumentare l'altezza della dimensione del contenuto di self.collectionView.

EDIT

Anche il mio suggerimento sopra, il ripristino delle dimensioni del contenuto, non funziona correttamente! Ho provato quanto segue quando aggiorno la mia vista collezione:

int numberOfRows = self.dataArray.count/3; 
self.collectionView.contentSize = CGSizeMake(self.view.frame.size.width, (numberOfRows * 200) + 300); 

Questo è molto brutto però. Questo perché si presuppone che tutte le mie immagini siano di dimensioni 200x200 px, che si adattino a 3 immagini per riga (da qui la divisione per 3).

Inoltre, anche con il +300 che ho, l'ultima riga posso vederne solo 3/4 e non tutto. Devo scorrere di più e potrò vederlo ma tornerà di nuovo su 3/4. È come la pergamena da rinfrescare, in cui la vista si sposta solo se la trascini e quando la lasci torna indietro dove si trovava. Perché sta succedendo? E 'solo che Apple ha progettato UICollectionView così male? Questo è un po 'ridicolo ... UITableViews regola automaticamente il loro scorrimento in base al loro contenuto.

risposta

13

Rispondendo ad alcune delle altre domande su UICollectionView, ho creato questo progetto dimostrativo e scorre perfettamente, quindi non so quale problema si sta verificando. L'unica cosa che dovevo fare per rendere l'ultima riga del tutto visibile era di aumentare la dimensione del riquadro in basso a 90. Ho anche aggiunto un metodo di completamento a performBatchUpdates: completion: per scorrere automaticamente in modo che l'ultimo elemento aggiunto sia visibile (notare che aggiungo degli oggetti extra usando performSelector; withObject: afterDelay :). Le mie immagini sono 48x48, e ho appena impostato la mia vista insieme ai limiti della vista del mio controller. Ecco il codice in modo che si può paragonare a quello che hai:

@interface ViewController() <UICollectionViewDataSource, UICollectionViewDelegateFlowLayout> { 
NSMutableArray *newData; 
} 
@property (nonatomic, retain) UICollectionView *collectionView; 
@property (nonatomic, retain) NSMutableArray *results; 
@end 

@implementation ViewController 

- (void)viewDidLoad { 
    self.results = [NSMutableArray array]; 
    int i = 11; 
    while (i<91) { 
     UIImage *image = [UIImage imageNamed:[NSString stringWithFormat:@"New_PICT00%d.jpg",i]]; 
     [self.results addObject:image]; 
     i++; 
    } 

    UICollectionViewFlowLayout *flowLayout = [[UICollectionViewFlowLayout alloc] init]; 
    //flowLayout.scrollDirection = UICollectionViewScrollDirectionHorizontal; 

    self.collectionView = [[UICollectionView alloc] initWithFrame:self.view.bounds collectionViewLayout:flowLayout]; 
    self.collectionView.dataSource = self; 
    self.collectionView.delegate = self; 
    self.view.backgroundColor = [UIColor blackColor]; 
    [self.view addSubview:self.collectionView]; 
    [self.collectionView registerClass:[UICollectionViewCell class] forCellWithReuseIdentifier:@"Cell"]; 
    //[self.collectionView registerClass:[RDCell class] forCellWithReuseIdentifier:@"myCell"]; 
    [self.collectionView reloadData]; 

    [self performSelector:@selector(addNewImages:) withObject:nil afterDelay:3]; 
} 

-(void)addNewImages:(id)sender { 
    newData = [NSMutableArray array]; 
    int i = 102; 
    while (i<111) { 
     UIImage *image = [UIImage imageNamed:[NSString stringWithFormat:@"New_PICT0%d.jpg",i]]; 
     [newData addObject:image]; 
     i++; 
    } 
    [self addNewCells]; 
} 

-(void)addNewCells { 
    NSMutableArray *arrayWithIndexPaths = [NSMutableArray array]; 
    [self.collectionView performBatchUpdates:^{ 
     int resultsSize = [self.results count]; 
     [self.results addObjectsFromArray:newData]; 
     for (int i = resultsSize; i < resultsSize + newData.count; i++) 
      [arrayWithIndexPaths addObject:[NSIndexPath indexPathForRow:i inSection:0]]; 
     [self.collectionView insertItemsAtIndexPaths:arrayWithIndexPaths]; 
    } 
    completion: ^(BOOL finished){ 
     [self.collectionView scrollToItemAtIndexPath:arrayWithIndexPaths.lastObject atScrollPosition:UICollectionViewScrollPositionCenteredVertically animated:YES]; 
    }]; 
} 


- (NSInteger)collectionView:(UICollectionView *)view numberOfItemsInSection:(NSInteger)section { 
    return [self.results count]; 
} 

- (NSInteger)numberOfSectionsInCollectionView: (UICollectionView *)collectionView { 
    return 1; 
} 

- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath { 
    UICollectionViewCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:@"Cell" forIndexPath:indexPath]; 
    //cell.iv.image = [self.results objectAtIndex:indexPath.row]; 
    cell.backgroundColor = [UIColor colorWithPatternImage:[self.results objectAtIndex:indexPath.row]]; 
    return cell; 
} 


- (CGSize)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout*)collectionViewLayout sizeForItemAtIndexPath:(NSIndexPath *)indexPath { 
    UIImage *image = [self.results objectAtIndex:indexPath.row]; 
    return CGSizeMake(image.size.width, image.size.height); 
} 

- (UIEdgeInsets)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout*)collectionViewLayout insetForSectionAtIndex:(NSInteger)section { 
    return UIEdgeInsetsMake(10, 10, 90, 10); 
} 

- (void)collectionView:(UICollectionView *)collectionView didSelectItemAtIndexPath:(NSIndexPath *)indexPath { 
    NSLog(@"Selected Image is Item %d",indexPath.row); 
} 
9

Impostazione dell'altezza del UICollectionView-3000 renderà il vostro problema scorrimento peggio. Se lo UICollectionView è alto 3000 pixel, sarà sempre necessario scorrere solo se contiene più di 3000 pixel di contenuto. Dovresti impostarlo all'altezza della vista in cui è contenuto (uguale alla larghezza).

per quanto ne so il, inoltre, non dovrebbe impostare il contentSize direttamente, invece è necessario eseguire l'override del metodo - (CGSize)collectionViewContentSize in una sottoclasse di UICollectionViewLayout, ma in generale non dovrebbe essere necessario cambiare la dimensione dei contenuti per usi normali.

Non sono del tutto chiaro su quale sia il tuo problema - è che quando aggiungi più di un valore di schermate di oggetti che non puoi scorrere?

+0

Questa era la soluzione per me. Stavo usando un layout di flusso personalizzato che rimuoveva gli spazi verticali tra gli elementi in un layout a più colonne. Avevo solo circa la metà degli articoli fino a quando non feci come suggeriva Simon. Sospetto che il motivo per cui ho avuto il problema è che il numero di elementi interrogati è basato su un layout standard. –

2

Ho riscontrato lo stesso problema perché stavo inizializzando gli elementi del mio insiemeView (cioè è DataSource) nel metodo viewWillAppear.

Infine aggiungo solo un [self.collectionView reloadData]; e funziona bene!

Forse sei nello stesso caso.

Problemi correlati