我正在使用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响应......
任何帮助都将不胜感激。
答案 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);