2014-04-17 7 views
45

Mam UICollectionView, który ładuje komórki z komórki wielokrotnego użytku, która zawiera etykietę. Tablica dostarcza treści dla tej etykiety. Mogę łatwo zmienić szerokość etykiety w zależności od szerokości treści za pomocą sizeToFit. Ale nie mogę zrobić komórki pasującej do etykiety.Dynamiczna szerokość komórki UICollectionView w zależności od szerokości etykiety

Oto kod

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

podobny rodzaj problemu ... http://stackoverflow.com/questions/24915443/uicollectionview- po prostu dopasowuj komórkę do szerokości ??? – Fattie

Odpowiedz

62

W sizeForItemAtIndexPath zamian rozmiar tekstu

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

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

Nie możesz sobie wyobrazić, jak ci dziękuję! To naprawdę działa. Teraz muszę tylko rozwiązać problem [cell.myLabel sizeToFit], ponieważ pojawia się w pełnym rozmiarze tylko po przewinięciu. Ale nie byłem nawet blisko twojego rozwiązania. – pulp

+0

dziękuję za pomoc, ale nadal mam jeden problem. Kiedy odkomentuję [cell.myLabel sizeToFit] mam słowa skrócone i litery ucięte na dole, ale po przewinięciu stają się ok. (Słowa mają normalny rozmiar, a litery przeskakują trochę). Jeśli komentuję i wyłączam komunikat [cell.myLabel sizeToFit] (zdecydowałem się bawić z IB i działa dobrze) Mam słowa wycięte na końcu i na dole. Zrobiłem zrzut ekranu http://goo.gl/HaoqQV Nie jest zbyt ostry na wyświetlaczach nie-siatkówkowych, ale widać, że litery się rozcięły. Twoja sugestia, jak rozwiązać, będzie naprawdę doceniona! – pulp

+1

zamiast sizeToFit, użyj sizeWithAttributes, aby uzyskać CGSize tekstu, a następnie ustaw ramkę etykiety z nowym rozmiarem. –

22

Zamówienie poniżej kod może być dając bardzo krótki 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 Dziękuję za odpowiedź, na pewno to sprawdzę i dam znać! – pulp

+0

+1000 Ten zdecydowanie działa.Stanowisko Yours and Basheer powinno mieć zielony znacznik wyboru. –

+0

Każdy pomysł, jak to zrobić z Swift 3? –

8

w Swift 3

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

// dodać w widoku didload

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