求教如何实现UICollectionViewCell的自适应宽度

如题所述

#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
温馨提示:内容为网友见解,仅供参考
第1个回答  2018-08-03
一般都是在设置collectionviewcell尺寸代理方法里将该字符串的长度算出来,设置长度,然后再去更新cell中label的长度,去更新cell中的必须考虑重用问题,所以每次进入cell代理方法都必须在更新一次数据里重新计算label长度,两者都设置好才能保证宽度的自适应本回答被网友采纳

求教如何实现UICollectionViewCell的自适应宽度
} return self; } #pragma mark — 实现自适应文字宽度的关键步骤:item的layoutAttributes - (UICollectionViewLayoutAttributes *)preferredLayoutAttributesFittingAttributes:(UICollectionViewLayoutAttributes *)layoutAttributes{ UICollectionViewLayoutAttributes *attributes = [super preferredLayoutAttr...

[IOS]UICollectionView CELL 自适应大小
点击任意一个CELL ,下方的数据发生改变,这里先用横向滚动的UITableView,不好做,然后用第三方的UIScrollView做的,也不好用 经过多次使用总结: 上面通过约束自适应的方案当只有一个 cell 的时候,会居中,需要自定义 followLayout 设置左对齐,总之会有各种各样的问题,经老开发提醒,UICollectionView 的宽高最...

iOS开发- UICollectionView详解+实例
自定义Cell是关键步骤之一,首先创建一个名为CollectionCell的UICollectionViewCell子类,并在Xcode中创建对应的XIB文件。在XIB中,移除默认View,添加一个CollectionViewCell,并设置其大小为95*116。接着,修改类名为CollectionCell,添加一个ImageView和一个Label。创建映射关系,修改init方法,并为CollectionCell...

求教如何实现UICollectionViewCell的自适应宽度
三列自适应布局没什么意义吧,而且还是根据内容,要做的话可以些写两层DIV,第一层固定宽度,第二层四个DIV,前三个用浮动,最后一个用清除浮动。

UICollectionView的cell的间隔怎么不一致的
(NSInteger)section;或直接设置layout.minimumInteritemSpacing = 0;但还要配合cell的大小、section左右缩进,因为collectionView默认section左右缩进左右是0,然后cell的宽度小的话,因为要保持cell宽度不变,这样cell之间还是有间隔。用故事板拖一个collectionView,调一调很直观 ...

ios uicollectionviewcell 没有重用内存过高怎么调整
1. 注意到你能设置的间距属性是minSpacing。所以第二行只能放下4个按钮时,就会把剩余的空白空间平均分布一下。 2. 在delegate的didSelect函数里把选中的行取消掉就可以了。

iOS开发UI篇--使用UICollectionView实现一个列表头部拉伸效果的案例
案例演示展示的是一个具有头部拉伸效果的列表界面。当列表的offsetY小于0时,顶部图片会随手势下拉,动态调整头部宽度和高度,带来更流畅的用户体验。直观效果如下:为了实现这一效果,需要自定义UICollectionViewFlowLayout。这是UICollectionView的核心功能,负责管理布局、组织和排列集合中的各个Cell、附属视图和...

UITableViewCell中嵌套UICollectionView
我们可以看到DAY1这个cell中包括一个UICollectionView来展示城市列表。这里的话有两个地方需要注意一下:1.因为城市的字数有的长有的短,所有UICollectionViewCell的长度是不确定的,这样导致UICollectionViewCell的布局并不是像现在这样都是左对齐的,cell之间的间距并不是固定的。      ...

UICollectionView
然后调用 collectionViewContentSize 获取content size进行布局。之后调用 layoutAttributesForElementsInRect 对可以在屏幕中显示的部分进行布局。layout必须返回屏幕中所有元素的布局属性,包括UICollectionViewCell或者Supplementary Views或者Decoration Views。这时,collectionView了解了足够多的信息去布局cells。当scro...

iOS UICollectionView自定义pageEnable属性
接下来需要重写父类中的一些方法,自定义UICollectionViewLayout时常用的方法有如下一些 我们选择重写这些方法中的4个方法即可完成需求 1.- (void)prepareLayout 2.- (BOOL)shouldInvalidateLayoutForBoundsChange:(CGRect)newBounds 3.-(NSArray *)layoutAttributesForElementsInRect:(CGRect)rect 4.- ...

相似回答