2

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

UICollectionView我自己UIViewController使用Storyboard创建了一个对象。的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 位于右侧。在此处输入图像描述

有谁知道为什么会发生这种情况?奇数/偶数索引可能无关紧要,但这就是正在发生的事情。

编辑:一些额外的代码..这是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。

我想我还应该添加CustomViewdrawRect方法,所以在这里..

- (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);
}

谢谢!

4

1 回答 1

2

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

编辑:

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

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

但是,正如我所说,我遇到了同样的问题,即所有其他单元格都留空,但原因不同。在cellForRowAtIndexPath中,我正在调用单元格的设置方法。该方法又会调用子视图的设置方法。子视图设置方法的参数之一是单元格的框架,因此它类似于 (in collectionViewCellSubclass) [self.view setupViewWithFrame:(CGRect)frame]

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

于 2013-10-09T23:03:39.007 回答