Uicollectionview国际象棋风格网格

时间:2014-10-02 17:18:54

标签: ios objective-c xcode uicollectionview

我必须实现一个国际象棋风格的网格视图来显示一些径向进度条。 enter image description here

我使用一些效率低下的算法来制作网格,因为UiCollectionView不使用行和列,并且它可以工作,但是当用户将集合滚动到极限并且集合的“行”从屏幕和用户释放屏幕,UICollectionViewCells重新出现,他们切换了颜色。

我知道BOOL会发生切换,但我不知道如何解决这个问题。

enter image description here enter image description here

这是我的算法(我有两个不同的UICollectionViewCells,每种颜色一个)

- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath{
    static NSString *identifier = @"Cell";
    static NSString *identifierPair = @"CellPair";
    UICollectionViewCell *cell ;
    UILabel *title;

    //...Creating the circle progress bar....


    if ((indexPath.item % 2) == 0) {
        if (isPair) {
            cell = [collectionView dequeueReusableCellWithReuseIdentifier:identifierPair forIndexPath:indexPath];
            isPair = NO;
            title = (UILabel *)[cell viewWithTag:12];
        }
        else
        {
            cell = [collectionView dequeueReusableCellWithReuseIdentifier:identifier forIndexPath:indexPath];
            isPair = YES;
            title = (UILabel *)[cell viewWithTag:11];

        }

    }
    else {
        if (isUneven) {
            cell = [collectionView dequeueReusableCellWithReuseIdentifier:identifierPair forIndexPath:indexPath];
            isUneven = NO;
            title = (UILabel *)[cell viewWithTag:12];
        }
        else
        {
            cell = [collectionView dequeueReusableCellWithReuseIdentifier:identifier forIndexPath:indexPath];
            isUneven = YES;
            title = (UILabel *)[cell viewWithTag:11];
        }
    }


    //...Setting the name to the cell....

    return cell;
}

2 个答案:

答案 0 :(得分:2)

UICollectionView中使用单个方格背景的情况似乎更多,但由于我不确定它是否可行,您可以执行以下操作:

+ (BOOL)checkersCellAtIndexIsDark:(NSIndexPath *)indexPath {
    NSInteger squareIndex = indexPath.item % 4;
    return (squareIndex == 0 || squareIndex == 3);
}

- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath {
    UICollectionViewCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:@"Cell" forIndexPath:indexPath];
    cell.backgroundColor = ([[self class] checkersCellAtIndexIsDark:indexPath])? [UIColor orangeColor] : [UIColor yellowColor];

    // Set other things

    return cell;
}

我不明白为什么你为不同的背景使用不同的reuseIdentifiers和titleLabels,因为我没有从屏幕上注意到,但你总是可以编辑这段代码

答案 1 :(得分:0)

您没有必要使用2个不同的单元格来更改背景。 您只需设置背景的默认颜色,当indexPath.item为偶数时,只需为单元格背景设置另一种颜色即可。 但首先设置默认颜色很重要,否则您将获得相同的结果。