2014-11-13 7 views
10

Sto lavorando in modo programmatico (senza storyboard) e sto riscontrando problemi nel rendere layout.itemSize dinamico per diverse dimensioni dello schermo. Ottengo questo messaggio di errore:Come rendere UICollectionViewFlowLayout itemDimensioni dinamiche per dimensioni dello schermo

"UICollectionView deve essere inizializzato con un non-nil parametro layout"

con il seguente codice nel mio file di implementazione:

- (instancetype)init 
{ 
    UICollectionViewFlowLayout *layout = [[UICollectionViewFlowLayout alloc] init]; 

    CGSize size = self.collectionView.bounds.size; 

    layout.itemSize = CGSizeMake(size.width, size.height); 

    [layout setScrollDirection:UICollectionViewScrollDirectionVertical]; 

    layout.minimumLineSpacing = 100.0; 

    layout.headerReferenceSize = CGSizeMake(0.0, 50.0); 

    return (self = [super initWithCollectionViewLayout:layout]); 
} 

I don' t ottenere il messaggio di errore se uso "100,100" ad esempio per layout.itemSize. C'è un modo per renderlo dinamico?

Sono nuovo nell'Obiettivo-C quindi apprezzerei qualsiasi aiuto su ciò che sto facendo in modo errato.

risposta

14

necessità di utilizzare il metodo delegato flusso:

- (CGSize)collectionView:(UICollectionView *)collectionView 
        layout:(UICollectionViewLayout *)collectionViewLayout 
    sizeForItemAtIndexPath:(NSIndexPath *)indexPath 
{ 
    CGSize cellSize = CGSizeMake(width, height); 

    return cellSize; 
} 

È possibile specificare i valori float larghezza e altezza a tutto ciò che si desidera.

Per esempio, permette di dire la tua CollectionView è verticale e si desidera una breve vista di testa, una grande vista centrale, quindi una piccola vista piè di pagina, allora si potrebbe fare qualcosa di simile:

- (CGSize)collectionView:(UICollectionView *)collectionView 
        layout:(UICollectionViewLayout *)collectionViewLayout 
    sizeForItemAtIndexPath:(NSIndexPath *)indexPath 
{ 
    CGSize cellSize; 

    cellSize.width = self.view.bounds.size.width; 

    if(indexPath.row == 0) 
    { 
     // header view height 
     cellSize.height = 100; 
    } 
    else if(indexPath.row == 1) 
    { 
     // body view height 
     cellSize.height = 500; 
    } 
    else 
    { 
     // assuming number of items is 3, then footer view is last view 
     // footer view height 
     cellSize.height = 100; 
    } 

    return cellSize; 
} 
1

aggiuntivo seguente metodo delegato la vostra collezione vista

-(CGSize)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout *)collectionViewLayout sizeForItemAtIndexPath:(NSIndexPath *)indexPath 
{ 
UIImage *image; 
long row = [indexPath row]; 

image = [UIImage imageNamed:_carImages[row]]; 

return image.size; 
} 

qui un link che si aiutano enter link description here