最近开发用到UICollectionView,需求是横向滑动,根据服务端传过来的数据,确定cell数量,以及根据每条数据的大小确定cell的宽度,点击的cell高亮显示。
使用代理方法
```Objective-c
-(CGSize)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout *)collectionViewLayout sizeForItemAtIndexPath:(NSIndexPath *)indexPath
```
当拿到数据模型的时候,即利用该模型的计算方法直接计算文本宽度,并赋值给数据模型的width属性,在上面的代理方法中,宽度直接返回model.witdh,return CGSizeMake{self.dataSource[indexPath.row].width, height}。//高度一样如果需要自适应也可利用此方法。
```Objective-c
- (CGSize)collectionView:(nonnullUICollectionView*)collectionView layout:(nonnullUICollectionViewLayout*)collectionViewLayout sizeForItemAtIndexPath:(nonnullNSIndexPath*)indexPath
{
if(self.dataSource) {
Model *model = (Model*)self.dataSource[indexPath.row];
returnCGSizeMake(model.width,28);
}else{
returnCGSizeMake(0,0);
}
}
```
根据字符串计算出他应该占据的宽度,需要两个参数,该字符串和想设置的字号大小,在此不再赘述。
```Objective-c
- (NSInteger)calculateWidth:(NSString*)routeDesc
{
CGSizesize = [routeDesc sizeWithFont:font];
returnsize.width+15;// +15两边留间距
}
- (CGSize)sizeWithFont:(UIFont*)font
{
if(self.length==0)
{
returnCGSizeZero;
}
NSDictionary* attrDic = [NSDictionarydictionaryWithObjectsAndKeys:font,NSFontAttributeName,nil];
CGSizesize = [selfsizeWithAttributes:attrDic];//sizeWithAttributes is the default suggested replace method for selector(sizeWithFont:)
returnsize;
}
```
高亮选择根据model的isSelect属性判断文本以及cell边框的颜色(为yes时是绿色,其他情况灰色),并在bindModel给cell绑定数据的方法中进行设置。
小结:自定义的UICollectionViewCell,实例方法必须实现initWithFrame,在设置该cell的边框颜色才会有效,如果只实现init方法的话,设置cell.contentView的border之类的属性不会有效。