레이블 너비에 따른 UICollectionView의 동적 셀 너비
레이블이 포함 된 재사용 가능한 셀에서 셀을로드하는 UICollectionView가 있습니다. 배열은 해당 레이블에 대한 내용을 제공합니다. sizeToFit으로 콘텐츠 너비에 따라 라벨 너비를 쉽게 조정할 수 있습니다. 하지만 레이블에 맞게 셀을 만들 수 없습니다.
다음은 코드입니다.
- (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;
}
에서 것은 sizeForItemAtIndexPath
텍스트의 크기를 반환
- (CGSize)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout*)collectionViewLayout sizeForItemAtIndexPath:(NSIndexPath *)indexPath{
return [(NSString*)[arrayOfStats objectAtIndex:indexPath.row] sizeWithAttributes:NULL];
}
코드 아래에서 확인하면 매우 짧은 CGSize를 제공 할 수 있습니다.
- (CGSize)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout*)collectionViewLayout sizeForItemAtIndexPath:(NSIndexPath *)indexPath{
NSString *testString = @"SOME TEXT";
return [testString sizeWithAttributes:NULL];
}
Swift 4.2 이상
원리는 :
구현
UICollectionViewDelegateFlowLayout
(필수 메서드 서명 포함)호출
collectionView...sizeForItemAt
방법.메서드 를 호출
String
하기 위해 브리지 캐스팅 할 필요가 없습니다 . Swift 는 즉시 사용할 수 있습니다.NSString
size(withAttributes:
String
속성은에 대해 설정 한 것과 동일합니다 (
(NS)AttributedString
예 : 글꼴 모음, 크기, 무게 등). 선택적 매개 변수.
샘플 솔루션 :
extension ViewController: UICollectionViewDelegateFlowLayout {
func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize {
return "String".size(withAttributes: nil)
}
}
But you would most likely want to specify concrete string attributes respective to your cell, hence final return would look like:
// Replace "String" with proper string (typically array element).
return "String".size(withAttributes: [
NSAttributedString.Key.font : UIFont.boldSystemFont(ofSize: 14)
])
I have found a small trick for swift 4.2
For dynamic width & fixed height:
func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize {
let label = UILabel(frame: CGRect.zero)
label.text = textArray[indexPath.item]
label.sizeToFit()
return CGSize(width: label.frame.width, height: 32)
}
For dynamic height & fixed width:
func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize {
let label = UILabel(frame: CGRect.zero)
label.text = textArray[indexPath.item]
label.sizeToFit()
return CGSize(width: 120, height: label.frame.height)
}
In Swift 3
let size = (arrayOfStats[indexPath.row] as NSString).size(attributes: nil)
Swift 4
let size = (arrayOfStats[indexPath.row] as NSString).size(withAttributes: nil)
//add in view didload
UICollectionViewFlowLayout *layout = [[UICollectionViewFlowLayout alloc] init];
[layout setScrollDirection:UICollectionViewScrollDirectionHorizontal];
layout.estimatedItemSize = CGSizeMake(self.breadScrumbCollectionView.frame.size.width, 30);
self.breadScrumbCollectionView.collectionViewLayout = layout;
'Programing' 카테고리의 다른 글
ggplot2에서 추가 범례 제거 (0) | 2020.10.14 |
---|---|
Sequelize.js에서 생성 된 SQL을 어떻게 볼 수 있습니까? (0) | 2020.10.14 |
F # 명시 적 일치 대 함수 구문 (0) | 2020.10.14 |
UIView 및 initWithFrame 및 NIB 파일. (0) | 2020.10.14 |
jQuery $ .browser는 더 이상 사용되지 않습니까? (0) | 2020.10.14 |