核心图形上下文似乎没有返回图像

时间:2014-01-19 07:18:30

标签: ios objective-c ios7 core-graphics uicollectionviewcell

我正在使用UICollectionViewCell尝试在右上角打印一个数字(从Core Data商店获得),以显示产品的更新次数。

通过重用单元格的方式,我发现如果我使用代码绘制到UIView层(使用CALayer),当重新使用单元格时,CALayer仍然存在,出现错误的产品。显然,根据SO上的其他帖子,向细胞添加子视图并不是一件聪明的事情,因为它们被重复使用等。

所以,我正在尝试使用Core Graphics(在一个单独的方法中)创建一个图像,并让图像出现在容器UIImageView中。在教程之后,我似乎无法返回图像。

我打电话为:

cell.messageCount.image = [self messageImageInRect:CGRectMake(48.0, 1.0, 21.0, 21.0)];

方法是:

-(UIImage *)messageImageInRect:(CGRect)rect {

    UIGraphicsBeginImageContextWithOptions(rect.size, NO, 0);
    CGContextRef context = UIGraphicsGetCurrentContext();

    NSLog(@"I am inside");
    NSLog(@"I have rect as: %@", NSStringFromCGRect(rect));
    NSLog(@"I have the size as: %@", NSStringFromCGSize(rect.size));
    NSLog(@"I have the context as: %@", context);

    CGContextSetLineWidth(context, 2.0f);
    CGContextAddEllipseInRect(context, rect);
    CGContextSetStrokeColorWithColor(context, [UIColor whiteColor].CGColor);
    CGContextSetFillColorWithColor(context, [UIColor redColor].CGColor);
    CGContextFillPath(context);
    CGContextStrokePath(context);
    UIImage *testImage = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();

    return testImage;

}

这似乎很基本。

NSLog语句可以帮助您找出正在发生的事情。但是,根据日志,它似乎工作,但是,我没有返回(或至少显示)图像。我不明白为什么。

日志显示:

2014-01-19 18:06:02.753 XXXXXXXX[62921:70b] I am inside
2014-01-19 18:06:02.754 XXXXXXXX[62921:70b] I have rect as: {{48, 1}, {21, 21}}
2014-01-19 18:06:02.754 XXXXXXXX[62921:70b] I have the size as: {21, 21}
2014-01-19 18:06:02.754 XXXXXXXX[62921:70b] I have the context as: <CGContext 0x10f133640>
2014-01-19 18:06:02.754 XXXXXXXX[62921:70b] I have test Image size as: {21, 21}

在UICollectionViewCell中定义了messageCount。

与往常一样,这已经是我大约3个小时的时间,阅读教程后的教程和SO响应和编程手册后的SO响应......

任何帮助都将不胜感激。

1 个答案:

答案 0 :(得分:1)

您正在绘制一个完全在上下文之外的椭圆,因此您根本看不到任何内容。

改变这个:

CGContextAddEllipseInRect(context, rect);

CGContextAddEllipseInRect(context, CGMakeRect(0, 0, rect.size.width, rect.size.height));

请注意,在创建图片上下文时,您提供了rect.size,但未提供rect.origin。因此,上下文无法知道您在rect.origin绘制的内容应该进入上下文的左上角。这取决于你实现这一目标。

这是另一种获得相同效果的方法。这有点容易,因为你只需要调整一次rect的原点;然后你可以使用rect做你想要的绘图,而无需再次调整。

CGContextTranslateCTM(context, -rect.origin.x, -rect.origin.y);
CGContextAddEllipseInRect(context, rect);

还有一件事:你会发现你看到了椭圆的填充,而不是中风。那是因为CGContextFillPath在绘制后清除了上下文的当前路径。要一步填充和描边路径:

CGContextDrawPath(context, kCGPathFillStroke);