在没有UICollectionViewFlowLayout
的情况下,有没有办法自定义UICollectionViewDelegateFlowLayout methods
?
和可以解析UICollectionViewLayoutAttributes
并size
给出origin
而不给UICollectionViewLayoutAttributes
?
所以我不需要在- (NSArray *)layoutAttributesForElementsInRect:(CGRect)rect
方法中实现每// call the two layout calculating methods , and combine.
- (void)prepareLayout{
[super prepareLayout];
if(self.attributesArray.count>0){
[self.attributesArray removeAllObjects];
}
NSInteger indexCount = [self.collectionView numberOfItemsInSection: 0];
for (NSInteger i = 0; i<indexCount; i++) {
NSIndexPath * indexPath = [NSIndexPath indexPathForItem:i inSection: 0];
UICollectionViewLayoutAttributes * attributes = [self layoutAttributesForItemAtIndexPath: indexPath];
[self.attributesArray addObject: attributes];
}
UICollectionViewLayoutAttributes * headAttributes = [self layoutAttributesForSupplementaryViewOfKind: UICollectionElementKindSectionHeader atIndexPath: [NSIndexPath indexPathForItem:0 inSection: 0]];
[self.attributesArray addObject: headAttributes];
}
// calculate the items layout
- (UICollectionViewLayoutAttributes *)layoutAttributesForItemAtIndexPath:(NSIndexPath *)indexPath{
UICollectionViewLayoutAttributes * cellAttributes = [UICollectionViewLayoutAttributes layoutAttributesForCellWithIndexPath: indexPath];
CGFloat baseOriginY = 133;
switch (indexPath.item) {
case 0:
{
cellAttributes.frame = CGRectMake(0, baseOriginY, KScreenWidth, 50);
}
break;
case 6: //7:
case 7: //8:
{
NSInteger count = indexPath.item-6;
cellAttributes.frame = CGRectMake(0, 155 + 50*count + baseOriginY, KScreenWidth, 50);
}
break;
case 5: //6:
{
cellAttributes.frame = CGRectMake(0, 145 + baseOriginY, KScreenWidth, 10);
}
break;
default:
{
NSInteger i = indexPath.item - 1;
cellAttributes.frame = CGRectMake(i*KScreenWidth/4.0, 50 + baseOriginY, KScreenWidth/4.0, 95);
}
break;
}
return cellAttributes;
}
// calculate the headers layout
- (UICollectionViewLayoutAttributes *)layoutAttributesForSupplementaryViewOfKind:(NSString *)elementKind atIndexPath:(NSIndexPath *)indexPath{
UICollectionViewLayoutAttributes * headerAttributes = [UICollectionViewLayoutAttributes layoutAttributesForSupplementaryViewOfKind: UICollectionElementKindSectionHeader withIndexPath: indexPath];
// headerAttributes.size = CGSizeMake(KScreenWidth, 133);
headerAttributes.frame = CGRectMake(0, 0, KScreenWidth, 133);
return headerAttributes;
}
// return the final layout results
- (NSArray<UICollectionViewLayoutAttributes *> *)layoutAttributesForElementsInRect:(CGRect)rect{
return self.attributesArray;
}
的框架。
不计算每个项目的来源非常方便。
以下是我的示例代码:
UICollectionViewFlowLayout
换句话说,使用UICollectionViewDelegateFlowLayout
的动态调整功能,而不符合css
协议。
动态调整功能,正如Apple所说:
流程布局使用一个固定距离布置其内容 方向和另一个可滚动的距离。例如,在 垂直滚动网格,网格内容的宽度为 约束到相应集合视图的宽度时 内容的高度动态调整以匹配数量 网格中的部分和项目。
我认为很有可能,我现在不知道如何实现它。也许是Apple的API。
非常欢迎任何建议或解释。
非常感谢提前。