求教如何实现UICollectionViewCell的自适应宽度
2个回答
2017-08-12 · 知道合伙人软件行家
关注
展开全部
#pragma mark — 自定义cell
#import "SelfSizingCollectCell.h"
#import "Masonry.h"
#define itemHeight 60
@implementation SelfSizingCollectCell
- (instancetype)initWithFrame:(CGRect)frame{
self = [super initWithFrame:frame];
if (self) {
self.contentView.backgroundColor = [UIColor redColor];
// 用约束来初始化控件:
self.textLabel = [[UILabel alloc] init];
self.textLabel.textAlignment =NSTextAlignmentCenter;
self.textLabel.backgroundColor = [UIColor greenColor];
[self.contentView addSubview:self.textLabel];
#pragma mark — 如果使用CGRectMake来布局,是需要在preferredLayoutAttributesFittingAttributes方法中去修改textlabel的frame的
// self.textLabel = [[UILabel alloc] initWithFrame:CGRectMake(0, 0, frame.size.width, 30)];
#pragma mark — 如果使用约束来布局,则无需在preferredLayoutAttributesFittingAttributes方法中去修改cell上的子控件l的frame
[self.textLabel mas_makeConstraints:^(MASConstraintMaker *make) {
// make 代表约束:
make.top.equalTo(self.contentView).with.offset(0); // 对当前view的top进行约束,距离参照view的上边界是 :
make.left.equalTo(self.contentView).with.offset(0); // 对当前view的left进行约束,距离参照view的左边界是 :
make.height.equalTo(@(itemHeight/2)); // 高度
make.right.equalTo(self.contentView).with.offset(0); // 对当前view的right进行约束,距离参照view的右边界是 :
}];
}
return self;
}
#pragma mark — 实现自适应文字宽度的关键步骤:item的layoutAttributes
- (UICollectionViewLayoutAttributes *)preferredLayoutAttributesFittingAttributes:(UICollectionViewLayoutAttributes *)layoutAttributes{
UICollectionViewLayoutAttributes *attributes = [super preferredLayoutAttributesFittingAttributes:layoutAttributes];
CGRect rect = [self.textLabel.text boundingRectWithSize:CGSizeMake(CGFLOAT_MAX, itemHeight) options:NSStringDrawingTruncatesLastVisibleLine| NSStringDrawingUsesFontLeading |NSStringDrawingUsesLineFragmentOrigin attributes:@{NSFontAttributeName: [UIFont systemFontOfSize:14]} context:nil];
rect.size.width +=8;
rect.size.height+=8;
attributes.frame = rect;
return attributes;
}
@end
#pragma mark — 视图控制器中使用:(关键)
layout.estimatedItemSize = CGSizeMake(20, 60); // layout约束这边必须要用estimatedItemSize才能实现自适应,使用itemSzie无效
视图控制器.m中源码
#import "ViewController.h"
#import "SelfSizingCollectCell.h"
@interface ViewController () <UICollectionViewDelegate,UICollectionViewDataSource>
@property (strong, nonatomic) UICollectionView *collection;
@property (strong, nonatomic) NSArray *dataArr;
@end
@implementation ViewController
#pragma mark --- lazyinit
- (NSArray *)dataArr{
if (!_dataArr) {
_dataArr = [NSArray array];
}
return _dataArr;
}
- (void)viewDidLoad {
[super viewDidLoad];
NSString *text = @"The UICollectionViewFlowLayout class is a concrete layout object that organizes items into a grid with optional header and footer views for each section. The items in the collection view flow from one row or column (depending on the scrolling direction) to the next, with each row comprising as many cells as will fit. Cells can be the same sizes or different sizesThe UICollectionViewFlowLayout class is a concrete layout object that organizes items into a grid with optional header and footer views for each section. The items in the collection view flow from one row or column.";
self.dataArr = [text componentsSeparatedByString:@" "];
UICollectionViewFlowLayout *layout = [[UICollectionViewFlowLayout alloc] init];
// 设置具体属性
// 1.设置 最小行间距
layout.minimumLineSpacing = 20;
// 2.设置 最小列间距
layout. minimumInteritemSpacing = 10;
// 3.设置item块的大小 (可以用于自适应)
layout.estimatedItemSize = CGSizeMake(20, 60);
// 设置滑动的方向 (默认是竖着滑动的)
layout.scrollDirection = UICollectionViewScrollDirectionVertical;
// 设置item的内边距
layout.sectionInset = UIEdgeInsetsMake(10,10,10,10);
self.collection = [[UICollectionView alloc] initWithFrame:CGRectMake(0, 0, [UIScreen mainScreen].bounds.size.width, [UIScreen mainScreen].bounds.size.height) collectionViewLayout:layout];
self.collection.backgroundColor = [UIColor whiteColor];
self.collection.delegate = self;
self.collection.dataSource = self;
[self.view addSubview:self.collection];
[self.collection registerClass:[SelfSizingCollectCell class] forCellWithReuseIdentifier:@"SelfSizingCollectCell"];
}
#pragma MARK --- UICollectionViewDelegate
- (NSInteger)numberOfSectionsInCollectionView:(UICollectionView *)collectionView{
return 1;
}
- (NSInteger)collectionView:(UICollectionView *)collectionView numberOfItemsInSection:(NSInteger)section{
return [self.dataArr count];
}
- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath{
SelfSizingCollectCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:@"SelfSizingCollectCell" forIndexPath:indexPath];
cell.textLabel.text = self.dataArr[indexPath.row];
return cell;
}
- (void)didReceiveMemoryWarning {
[super didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
}
@end
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询