UICollectionView奇数编号的单元格留空

时间:2013-10-08 23:30:16

标签: iphone ios uicollectionview uicollectionviewcell

我正在使用自定义单元格制作UICollectionView,并且发生了一件非常奇怪的事情。 indexPath.row ODD 数字的所有单元格都留空,我无法对其进行任何绘制。

我使用 Storyboard 在我自己的UICollectionView中创建了一个UIViewController对象。 UICollectionView个单元格设置为我的自定义UICollectionViewCell子标题,名为 CustomCell 。每个单元格占据UICollectionView的整个宽度和高度。 CustomCell内部的所有内容都是以编程方式创建的,而不是使用Storyboard。这是我的cellForItemAtIndexPath代码:

- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath
{
    CustomCell *cell = (CustomCell *)[collectionView dequeueReusableCellWithReuseIdentifier:@"Cell" forIndexPath:indexPath];
    //createViewWithDay is used to populate the contents of the cell
    [cell createViewWithDay:indexPath.row isToday:YES withSize:cell.frame.size];

    NSInteger x = indexPath.row;
    NSLog(@"Path: %i", x);

    return cell;
}

每个 CustomCell 都会创建一个自定义视图(名为 CustomView ),并将其添加为子视图。现在,所有CustomView都会绘制一个X轴和一个Y轴。

奇怪的是,cellForItemAtIndexPath正确地为每个单元格触发。也就是说,它被调用偶数和奇数索引。与委托方法didSelectItemAtIndexPath相同。每个 CustomView 的绘图不会根据单元格的索引进行更改。事实上,根据索引,一切都没有变化。以下是运行应用程序时显示的示例。

在第一张图片中,绘制轴的单元格为indexPath.row == 14,黑色单元格为indexPath.row == 15。在第二张图片中,索引15位于左侧,索引16位于右侧。enter image description here

有人知道为什么会这样吗?奇数/偶数指数可能无关紧要,但这就是正在发生的事情。

编辑: 一些额外的代码.. 这是createViewWithDay,在cellForItemAtIndex方法中调用:

- (void)createViewWithDay:(float)day isToday:(BOOL)today withSize:(CGSize)size
{

    CustomView *newView = [[CustomView alloc] initWithFrame:self.frame];

    [newView viewForDay:day overDays:6 withDetail:20 today:YES withSize:size];

    [newView setBackgroundColor:[UIColor whiteColor]];
    [self addSubview:newView];
}

这里是viewForDay

- (void)viewForDay:(NSInteger)primaryDay overDays:(NSInteger)days withDetail:(NSInteger)detail today:(BOOL)today withSize:(CGSize)size
{
    _graphPrimaryDay = primaryDay;
    _numberOfDays = days;
    _lineDetail = detail;
    _isToday = today;
    _viewSize = self.frame.size;
    _pointsPerDay = (float)(_lineDetail / _numberOfDays);
    _isReadyToDraw = YES;

    [self createGraphDays];
}

viewForDay方法只分配一些 CustomView 实例变量,而createGraphDays方法使用虚拟数据填充NSMutableArray。

我想我还应该添加 CustomView drawRect方法,所以这里是..

- (void)drawRect:(CGRect)rect
{
    if(_isReadyToDraw)
    {
        [self drawGraph];
    }
}

这里是drawGraph ..

- (void)drawGraph
{

    CGContextRef context = UIGraphicsGetCurrentContext();

    CGContextMoveToPoint(context, 0, _viewSize.height / 2);
    CGContextAddLineToPoint(context, _viewSize.width, _viewSize.height / 2);

    if(_isToday)
    {
        CGContextMoveToPoint(context, _viewSize.width / 2, 0);
        CGContextAddLineToPoint(context, _viewSize.width / 2, _viewSize.height);
    }

    CGContextSetLineWidth(context, 2.5);
    CGContextSetStrokeColorWithColor(context, [UIColor blackColor].CGColor);

    CGContextStrokePath(context);
}

谢谢!

1 个答案:

答案 0 :(得分:2)

我相信我找到了解决问题的方法。在前两个单元格(索引0和1)之后,我的自定义视图的drawRect方法不再被调用。无论出于何种原因,自定义视图都覆盖了自定义单元格的背景颜色,该颜色为黑色。所以我通过在我的自定义视图上调用setNeedsDisplay来修复它,以便强制为每个单元格绘制正确的图像。

编辑:

对于这个问题的实例,这是正确的答案,但实际上我遇到了同样的问题,原因不同。

对于旧解决方案,我所做的只是确保[cell createViewWithDay:isToday:withSize:](从cellForRowAtIndexPath调用)包含[self.view setNeedsDisplay],以便手动更新单元格的视图。< / p>

然而,正如我所说,我遇到了同样的问题,其他每个细胞都留空了,但原因不同。在cellForRowAtIndexPath中,我正在调用单元格的设置方法。这个方法反过来会调用子视图的设置方法。子视图的设置方法的一个参数是单元格的框架,因此它将是(在collectionViewCellSubclass[self.view setupViewWithFrame:(CGRect)frame]中的行。

对于第一个单元格,这工作正常,但对于第二个单元格,传递给视图的框架为(320, 0, 320, 250)。因为单元格相对于集合视图具有(320, 0)的原点,所以单元格的子视图的原点始终为(320, 0),但相对于单元格,因此实际上它将被放置在屏幕外。仅通过初始化子视图的大小并确保其原点为(0, 0)来解决此问题。整个问题现在已经过了很长时间,但希望这个替代问题和解决方案会有所帮助。