UICollectionViewCell 奇怪的行为。单元格未正确更新图层

Posted

技术标签:

【中文标题】UICollectionViewCell 奇怪的行为。单元格未正确更新图层【英文标题】:UICollectionViewCell strange behaviour. Cells not updating layer correctly 【发布时间】:2016-07-28 05:31:22 【问题描述】:

我有一个带有多个单元格的UICollectionView,我在其上添加了一个代表每个单元格颜色的CAGradient 层。问题是,当我将另一个视图控制器推到当前视图控制器之上,然后弹出第二个视图控制器时,我的集合视图单元格以随机顺序改变颜色。为了给你一个想法,我附上了截图。

这是单元格的原始顺序。这是对的

当我推送另一个视图控制器然后返回时会发生这种情况 即使我什么都没做,你也可以看到单元格的颜色发生了变化。

这是我用来初始化单元格的代码。

[collectionview reloadData] 在 -viewWillAppear 中调用,因此每次视图出现时都会加载单元格

- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath

    [self filterRecords];
    MyCell *cell = (MyCell*)[collectionView dequeueReusableCellWithReuseIdentifier:@"ProspectCVCell" forIndexPath:indexPath];


    for (int i = 0; i < [eventsSortedForAddedDate count]; i++)
    
        Events* event = (Events*)[eventsSortedForAddedDate objectAtIndex:i];

        if ([event.activityLevel.activityName isEqualToString:@"None"])
            continue;

        color = [[event activityLevel] color];

        if (![color isEqualToString:@"#FFCCCCCC"])
            break;
        else
            color = nil;
    


    if (!([color length] > 0) || color == nil)
    
        color = @"#FFCCCCCC";
    

    UIColor* myColor = [self getUIColorObjectFromHexString:color alpha:.9];

    //cell.backgroundColor = myColor;

    CAGradientLayer *gradient = [CAGradientLayer layer];
    gradient.frame = cell.bounds;
    gradient.colors = [NSArray arrayWithObjects:(id)[myColor CGColor], (id)[[UIColor whiteColor] CGColor], nil];
    gradient.locations = [NSArray arrayWithObjects:[NSNumber numberWithFloat:0.0f], [NSNumber numberWithFloat:0.85f],  nil];
    //[cell.layer insertSublayer:gradient atIndex:0];
    [cell.layer insertSublayer:gradient atIndex:0];


    cell.prospectImageView.layer.shadowColor = [UIColor blackColor].CGColor;
    cell.prospectImageView.layer.shadowOffset = CGSizeMake(0, 3.0);
    cell.prospectImageView.layer.shadowRadius = 3.0;
    cell.prospectImageView.layer.shadowOpacity = 0.8;

    cell.cellLabel.text = p.displayName;

    cell.layer.borderWidth = 0.5f;
    cell.layer.borderColor = [UIColor whiteColor].CGColor;

    return cell;

我获取颜色的方式没有任何问题,我已经调试了多次并检查了我得到的颜色是否正确。 如果我这样做了

cell.backgroundColor = myColor;

单元格不会按预期改变其颜色和功能。所以我很确定问题出在 CAGradientLayer 上。

我已经尝试了所有我能想到的方法,但似乎没有任何效果!

【问题讨论】:

如果 [event.activityLevel.activityName isEqualToString:@"None"] 然后你 continue 但是如果你在整个循环中没有得到 none 会发生什么? 然后执行下面的 if 条件,因为颜色将为 nil,我将分配默认颜色,即灰色阴影。但正如您从上面的屏幕截图中看到的那样,情况并非如此。我得到正确的颜色值。就像我提到的那样,如果我执行 cell.backgroundColor = myColor,则单元格会按预期运行。当我使用 CAGradientLayer 时出现问题 试试我的答案,它可能有用!!! 【参考方案1】:

试试这个,

 [cell.layer insertSublayer:gradient atIndex:[[cell.layer sublayers] indexOfObject:[[cell.layer sublayers] lastObject]]];

而不是

 [cell.layer insertSublayer:gradient atIndex:0];

更新:

如评论中所问,Apple doc 陈述了 dequeueReusableCellWithReuseIdentifier

当被要求为集合视图提供新单元格时,从您的数据源对象调用此方法。如果一个现有单元格可用,此方法会将现有单元格出列,或者根据您之前注册的类或 nib 文件创建一个新单元格。

And second thing you can also remove previous layers and then can add new one at index 0. it is better because it not increase number of layer which is not necessary.

【讨论】:

谢谢!!这就是他们称你为狮子的原因:D 在过去的 8 个小时里,我一直在摸不着头脑。现在完美运行。 虽然我仍然不明白是什么导致了这个问题。每次我重新加载时都会创建单元格,对吗?那为什么还没有创建图层。或者细胞被去队列了?我仍然对 dequeing 的概念有些困惑 谢谢,帮了大忙。虽然我确实尝试在添加渐变图层之前删除图层,但它只是让应用程序崩溃。我可能没有正确删除它们。我这样做了 [[cell.layer sublayers] removeObjectAtIndex:0] 首先,您应该检查该层是否存在的 if 语句,然后您应该删除。 [cell.layer sublayers] 返回 NSArray,因此您不能从中删除对象,因为它是不可变的。所以你应该使用[layer removeFromSuperlayer];

以上是关于UICollectionViewCell 奇怪的行为。单元格未正确更新图层的主要内容,如果未能解决你的问题,请参考以下文章

如果浮动大小,奇怪的 UICollectionViewCell 行为

将 UIButton 添加到 UICollectionViewCell 时的奇怪行为

UICollectionViewCell 奇怪的行为。单元格未正确更新图层

UICollectionViewCell 中的 UILabel 布局怪异

在 UICollectionViewCell 中添加模糊

在 UICollectionViewCell 中更新 UITableView