使用自定义Flow Layout更改UICollectionView单元格大小

时间:2016-03-17 16:22:44

标签: ios objective-c uicollectionview uicollectionviewlayout

我有五行细胞,每行包含四个细胞--5x4。我试图完成几乎像Apple一样的效果。屏幕中心的行应该具有100x100的单元格大小,其余的返回大小为80x80。滚动时,远离中心的行应转为80x80,移动到中心的行应转为100x100。

我已实施prepareLayoutlayoutAttributesForElementsInRectlayoutAttributesForItemAtIndexPath

所以现在我有一个100x100细胞中心行,其余80x80。 为了让它变得动态,我实现shouldInvalidateLayoutForBoundsChange但没有任何反应。

- (BOOL)shouldInvalidateLayoutForBoundsChange:(CGRect)newBounds{

     NSMutableArray *allAttributes = [NSMutableArray arrayWithCapacity:self.layoutInfo.count];

     [self.layoutInfo enumerateKeysAndObjectsUsingBlock:^(NSString *elementIdentifier,
                                                     NSDictionary *elementsInfo,
                                                     BOOL *stop) {
          [elementsInfo enumerateKeysAndObjectsUsingBlock:^(NSIndexPath *indexPath,
                                                      UICollectionViewLayoutAttributes *attributes,
                                                      BOOL *innerStop) {
        //     NSLog(@"%f, %f", newBounds.origin.x, newBounds.origin.y);

             if ((newBounds.origin.y < [[UIScreen mainScreen]bounds].size.height/2-50) && (newBounds.origin.y > [[UIScreen mainScreen]bounds].size.height/2+50)) {
                 CGRect frame = attributes.frame;
                 frame.size.width = 100.0f;
                 frame.size.height = 100.0f;
                 attributes.frame = frame;
             }else{
                 CGRect frame = attributes.frame;
                 frame.size.width = 80.0f;
                 frame.size.height = 80.0f;
                 attributes.frame = frame;
             }
             [allAttributes addObject:attributes];
         }];
     }];

     return YES;
}

1 个答案:

答案 0 :(得分:0)

shouldInvalidateLayoutForBoundsChange:经常被调用(每当视图调整大小或滚动时......),所以你可能不需要在那里完成所有工作。如果你知道你的单元格总是有固定的大小和位置,那么你可以在这里返回NO

只要您已实施prepareLayoutlayoutAttributesForElementsInRectlayoutAttributesForItemAtIndexPath,请确保同时实施collectionViewContentSize以返回内容的总大小。