场景描述: 在UICollectionViewFlowLayout的子类里重写layoutAttributesForElementsInRect方法, 为了实现不同的cell效果, 可以修改某组或某个Item的UICollectionViewLayoutAttributes.
效果图如下:
Paste_Image.png现在要修改第一组(中间组只有一个item)的item的size, 宽为屏幕的宽度, 高度为原来item高度的2倍
在prepareLayout方法里设置好item的布局, 然后在layoutAttributesForElementsInRect方法里修改第1组Item的UICollectionViewLayoutAttributes属性
代码如下:
//此方法会计算并返回每个item的位置和大小,换句话说就是collectionView里面的布局是怎样布局的就根这个方法的返回值有关
//此方法会先计算一定数量的数据,当你继续滚动需要一些新数据时会再次来计算新的数据
//只要在这里有过返回的数据都会缓存起来,下次再滚回来不会再帮你计算新数据
-(NSArray<UICollectionViewLayoutAttributes *> *)layoutAttributesForElementsInRect:(CGRect)rect{
//获取原本的布局数据
NSArray *arr = [super layoutAttributesForElementsInRect:rect];
// NSLog(@"ZFBFunctionListFlowLayout + layoutAttributesForElementsInRect");
//循环遍历所有布局数据
for (UICollectionViewLayoutAttributes *attr in arr) {
if(attr.indexPath.section == 1){
//如果是第1组,就把它的宽度放大
CGRect frame = attr.frame;
frame.size.width = self.collectionView.bounds.size.width;
frame.size.height = frame.size.height * 2;
attr.frame = frame;
// break;//因为只需要改这一个,后面都不需要改,所以break结束这个循环
}
if (attr.indexPath.section == 2) {
CGRect frame = attr.frame;
frame.origin.y += frame.size.height;
attr.frame = frame;
}
}
return arr;
}
出现Warning:
Logging only once for UICollectionViewFlowLayout cache mismatched frame
This is likely occurring because the flow layout subclass ZFBFunctionListFlowLayout is modifying attributes returned by UICollectionViewFlowLayout without copying them
大概意思是说我们自定义的布局对象正在修改由UICollectionViewFlowLayout返回的UICollectionViewLayoutAttributes属性, 而这个属性没有经过copy处理.
解决方法:
把原来的
NSArray *arr = [super layoutAttributesForElementsInRect:rect];
替换成
NSArray *arr = [[NSArray alloc]initWithArray:[super layoutAttributesForElementsInRect:rect] copyItems:YES];
这样就解决了:)
网友评论