最近开发用到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之类的属性不会有效。