根据indexPath自定义UICollectionViewCell

时间:2014-06-17 15:08:34

标签: ios customization uicollectionviewcell

您好我正在尝试根据其indexPath自定义我的collectionviewcell,但如果我设置

if (indexPath.row == 0)
{
     [cell addSubView: view];
}

视图在某些单元格中显示为随机。 这是我正在使用的代码

- (NSInteger)collectionView:(UICollectionView *)collectionView numberOfItemsInSection:(NSInteger)section
{
    return 15;
}

// The cell that is returned must be retrieved from a call to -dequeueReusableCellWithReuseIdentifier:forIndexPath:
- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath
{
    UICollectionViewCell *cell=[collectionView dequeueReusableCellWithReuseIdentifier:@"cellIdentifier" forIndexPath:indexPath];
    NSInteger row = indexPath.row;
    UIView *contentCell = [[UIView alloc] initWithFrame:cell.frame];
    if (row == 0)
    {
        UILabel *label = [[UILabel alloc] initWithFrame:CGRectMake(1.0f, 1.0f, 50.0f, 50.0f)];
        label.text = @"Test";
        [contentCell addSubview:label];
    }
    [cell addSubview:contentCell];
    cell.backgroundColor=[UIColor colorWithPatternImage:[UIImage imageNamed:@"container"]];
    return cell;
}

-(void)collectionView:(UICollectionView *)collectionView didSelectItemAtIndexPath:(NSIndexPath *)indexPath
{
    NSLog(@"%d", indexPath.row);
}

- (CGSize)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout*)collectionViewLayout sizeForItemAtIndexPath:(NSIndexPath *)indexPath
{
    return CGSizeMake(414, 228);
}

2 个答案:

答案 0 :(得分:0)

您要多次添加视图作为子视图。由于" dequeueReusableCellWithReuseIdentifier"重复使用单元格,因此在向上和向下滚动后,您将返回已添加子视图的现有视图。

您应该阅读有关重复使用单元格的更多信息。

避免这种行为的一种方法是在创建单元格时创建所有视图,然后只显示/隐藏它们。 否则,为不同的行创建具有不同标识符的单元格 - 在第0行的情况下。

答案 1 :(得分:0)

你必须阅读有关可重复使用的细胞的信息。

你可以通过这样做来避免这个问题。

if (row == 0)
{
    UILabel *label = [[UILabel alloc] initWithFrame:CGRectMake(1.0f, 1.0f, 50.0f, 50.0f)];
    label.text = @"Test";
    label.tag = 200;
    [contentCell addSubview:label];
}else{
    UIView* lbl = [contentCell viewWithTag:200];
    if(lbl)
       [lbl removeFromSuperView];
}

但这会影响滚动和内存性能,您可以将标签默认放在单元格中&&在if / else块中显示/隐藏它