2014-04-17 3 views
45

레이블이 포함 된 재사용 가능한 셀에서 셀을로드하는 UICollectionView가 있습니다. 배열은 해당 레이블의 내용을 제공합니다. sizeToFit을 사용하여 내용 너비에 따라 쉽게 레이블 너비의 크기를 조정할 수 있습니다. 하지만 레이블에 맞게 셀을 만들 수는 없습니다.레이블 너비에 따라 UICollectionView의 동적 셀 너비

여기 sizeForItemAtIndexPath 대가 코드 아래

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

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

비슷한 종류의 ... http://stackoverflow.com/questions/24915443/uicollectionview- 단순히 맞는 - 셀 - 투 - 폭 ??? – Fattie

답변

62

입니다. 보기에서 추가 // 스위프트 3에서

- (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; 
} 
+4

감사의 말을 상상할 수 없습니다! 그것은 정말로 효과적이다. 이제는 스크롤 한 후에 만 ​​전체 크기로 나타나기 때문에 [cell.myLabel sizeToFit] 문제를 해결하면됩니다. 그러나 나는 당신의 해결책에 가깝지 않았습니다. – pulp

+0

도움을 주셔서 감사합니다.하지만 여전히 한 가지 문제가 있습니다. [cell.myLabel sizeToFit]의 주석을 제거 할 때 말은 잘리고 글자는 아래쪽에서 자릅니다. 그러나 스크롤 한 다음에는 단어가 정상 크기로 바뀌고 글자가 조금 올라갑니다. 내가 [cell.myLabel sizeToFit] 메시지를 주석 처리하고 사용 중지하면 (IB로 놀기로 결정하고 정상적으로 작동하기로 결심했습니다.) 맨 끝에 단어가 잘리는 것 같습니다. 스크린 샷을 만들었습니다. http://goo.gl/HaoqQV 비 망막 디스플레이는 매우 선명하지 않지만 글자가 잘리는 것을 볼 수 있습니다. 해결 방법에 대한 귀하의 제안은 정말 감사하겠습니다! – pulp

+1

대신 sizeToFit을 사용하고 sizeWithAttributes를 사용하여 텍스트의 CGSize를 가져온 다음 레이블의 프레임을 새 크기로 설정합니다. –

22

체크 아웃 당신은 매우 짧은 CGSize를 제공 ​​할 수있는 텍스트의 크기 코드

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

@Vineesh TP 답변 해 주셔서 감사합니다. 확실히 알려 드리겠습니다. – pulp

+0

+1000 이것은 확실히 작동합니다.너와 Basheer의 게시물에는 녹색 체크 표시가 있어야한다. –

+0

신속한 3과 함께하는 방법에 대한 아이디어가 있습니까? –

8

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

을 didload
UICollectionViewFlowLayout *layout = [[UICollectionViewFlowLayout alloc] init]; 
    [layout setScrollDirection:UICollectionViewScrollDirectionHorizontal]; 
    layout.estimatedItemSize = CGSizeMake(self.breadScrumbCollectionView.frame.size.width, 30); 
self.breadScrumbCollectionView.collectionViewLayout = layout; 
문제의
관련 문제