对于较轻的视图控制器,有没有更好的方法来自定义UICollectionViewFlowLayout?

时间:2017-12-11 09:08:27

标签: ios objective-c user-interface uicollectionviewflowlayout

在没有UICollectionViewFlowLayout的情况下,有没有办法自定义UICollectionViewDelegateFlowLayout methods

可以解析UICollectionViewLayoutAttributessize给出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。

非常欢迎任何建议或解释。

非常感谢提前。

0 个答案:

没有答案