8

我有一个 CollectionViewController

- (void)viewDidLoad 
{
   [super viewDidLoad];    
   // assign layout (subclassed below)
   self.collectionView.collectionViewLayout = [[CustomCollectionLayout alloc] init];
}

// data source is working, here's what matters:
- (UICollectionViewCell *)collectionView:(UICollectionView *)cv cellForItemAtIndexPath:(NSIndexPath *)indexPath {
   ThumbCell *cell = (ThumbCell *)[cv dequeueReusableCellWithReuseIdentifier:@"ThumbCell" forIndexPath:indexPath];

   return cell;
}

我还有一个 UICollectionViewLayout 子类:CustomCollectionLayout.m

#pragma mark - Overriden methods
- (CGSize)collectionViewContentSize
{
    return CGSizeMake(320, 480);
}

- (NSArray *)layoutAttributesForElementsInRect:(CGRect)rect
{
    return [[super layoutAttributesForElementsInRect:rect] mutableCopy];
}

- (UICollectionViewLayoutAttributes *)layoutAttributesForItemAtIndexPath:(NSIndexPath *)indexPath
{
    // configure CellAttributes
    cellAttributes = [super layoutAttributesForItemAtIndexPath:indexPath];

    // random position
    int xRand = arc4random() % 320;
    int yRand = arc4random() % 460;
    cellAttributes.frame = CGRectMake(xRand, yRand, 150, 170);

    return cellAttributes;
}

我正在尝试为单元格使用一个新框架,只是一个随机位置。问题是 layoutAttributesForItemAtIndexPath 没有被调用。

提前感谢您的任何建议。

4

2 回答 2

12

编辑:我没有注意到你已经解决了你的案子,但我遇到了同样的问题,这对我的案子有帮助。我把它留在这里,考虑到这个话题还没有太多,它可能对某人有用。

绘制时,UICollectionView不调用该方法layoutAttributesForItemAtIndexPath:,而是layoutAttributesForElementsInRect:确定哪些单元格应该可见。你有责任实现这个方法,并从那里调用layoutAttributesForItemAtIndexPath:所有可见的索引路径来确定确切的位置。

换句话说,将其添加到您的布局中:

- (NSArray *)layoutAttributesForElementsInRect:(CGRect)rect
{
    NSMutableArray * array = [NSMutableArray arrayWithCapacity:16];
    // Determine visible index paths
    for(???) {
        [array addObject:[self layoutAttributesForItemAtIndexPath:[NSIndexPath indexPathForItem:??? inSection:???]]];
    }
    return [array copy];
}
于 2012-10-24T20:59:40.193 回答
0

故事板参数有问题。从 Inspector 面板分配自定义 UICollectionLayout。在此处输入图像描述

于 2012-10-24T14:32:22.540 回答