2014-04-17 7 views
45

Ho un UICollectionView, che carica le celle dalla cella riutilizzabile, che contiene l'etichetta. Un array fornisce contenuti per tale etichetta. Posso ridimensionare facilmente la larghezza dell'etichetta in base alla larghezza del contenuto con sizeToFit. Ma non posso creare celle per adattarle all'etichetta.Larghezza cella dinamica di UICollectionView in base alla larghezza dell'etichetta

Ecco il codice

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 
    // Do any additional setup after loading the view, typically from a nib. 
    arrayOfStats = @[@"time:",@"2",@"items:",@"10",@"difficulty:",@"hard",@"category:",@"main"]; 
} 

- (NSInteger)collectionView:(UICollectionView *)collectionView numberOfItemsInSection:  (NSInteger)section{ 
    return [arrayOfStats count]; 
} 

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

    return CGSizeMake(??????????); 
} 

- (NSInteger)numberOfSectionsInCollectionView:(UICollectionView *)collectionView{ 

    return 1; 
} 

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

    Cell *cell = (Cell *) [collectionView dequeueReusableCellWithReuseIdentifier:@"qw" forIndexPath:indexPath]; 
    cell.myLabel.text = [NSString stringWithFormat:@"%@",[arrayOfStats objectAtIndex:indexPath.item]]; 
    // make label width depend on text width 
    [cell.myLabel sizeToFit]; 

    //get the width and height of the label (CGSize contains two parameters: width and height) 
    CGSize labelSize = cell.myLbale.frame.size; 

    NSLog(@"\n width = %f height = %f", labelSize.width,labelSize.height); 

    return cell; 
} 
+0

simile tipo di problema ... http://stackoverflow.com/questions/24915443/uicollectionview- semplicemente-fit-cell-to-width ??? – Fattie

risposta

62

Nel sizeForItemAtIndexPath restituire la dimensione del testo

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

    return [(NSString*)[arrayOfStats objectAtIndex:indexPath.row] sizeWithAttributes:NULL]; 
} 
+4

Non puoi immaginare come ti ringrazio! Funziona davvero. Ora ho solo bisogno di risolvere il problema [cell.myLabel sizeToFit], perché appare a grandezza intera solo dopo lo scorrimento. Ma non sono nemmeno stato vicino alla tua soluzione. – pulp

+0

grazie per il tuo aiuto ma ho ancora un problema. Quando decommento [cell.myLabel sizeToFit] ho le parole troncate e le lettere tagliate in basso ma diventa ok dopo lo scorrimento (le parole hanno dimensioni e lettere normali salgono un po '). Se commento e disabilito il messaggio [cell.myLabel sizeToFit] (ho deciso di giocare con IB e funziona bene) Ho parole tagliate alla fine e al fondo. Ho fatto uno screenshot http://goo.gl/HaoqQV Non è molto nitido sui display non retina, ma puoi vedere che le lettere sono state tagliate. Il tuo suggerimento su come risolvere sarà davvero apprezzato! – pulp

+1

invece di sizeToFit, usa sizeWithAttributes per ottenere il CGSize del testo, quindi imposta il frame dell'etichetta con una nuova dimensione. –

22

Checkout sotto codice che potrebbe essere dare molto breve CGSize.

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

    NSString *testString = @"SOME TEXT"; 
    CGSize calCulateSizze =[testString sizeWithAttributes:NULL]; 
    calCulateSizze.width = calCulateSizze.width; 
    calCulateSizze.height = calCulateSizze.height; 
    return calCulateSizze; 
} 
+0

@Vineesh TP Grazie per la vostra risposta, controllerò sicuramente e vi farò sapere! – pulp

+0

+1000 Questo sicuramente funziona.Il post di Your e Basheer dovrebbe avere un segno di spunta verde insieme. –

+0

Qualche idea su come farlo con swift 3? –

8

In Swift 3

let size = (arrayOfStats[indexPath.row] as NSString).size(attributes: nil) 
-1

// aggiungere nella vista didload

UICollectionViewFlowLayout *layout = [[UICollectionViewFlowLayout alloc] init]; 
    [layout setScrollDirection:UICollectionViewScrollDirectionHorizontal]; 
    layout.estimatedItemSize = CGSizeMake(self.breadScrumbCollectionView.frame.size.width, 30); 
self.breadScrumbCollectionView.collectionViewLayout = layout;