我正在使用自定义单元格制作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位于右侧。
有人知道为什么会这样吗?奇数/偶数指数可能无关紧要,但这就是正在发生的事情。
编辑:
一些额外的代码..
这是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);
}
谢谢!
答案 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)
来解决此问题。整个问题现在已经过了很长时间,但希望这个替代问题和解决方案会有所帮助。