我正在使用 UICollectionViewCell
尝试在右上角打印一个数字(从 Core Data 存储中获得)以显示产品的更新次数。
随着单元格被重用的方式,我发现如果我使用代码绘制到 UIView
层(使用 CALayer),当单元格被重用时,CALayer
仍然存在并由错误的产品出现。显然,根据 SO 上的其他帖子,向单元格添加 subview 并不是一件聪明的事情,因为它们会被重用等。
因此,我正在尝试使用 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 响应和编程手册 ...
如有任何帮助,我们将不胜感激。
最佳答案
您正在绘制一个完全在上下文之外的椭圆,因此您根本看不到任何东西。
改变这个:
CGContextAddEllipseInRect(context, rect);
到
CGContextAddEllipseInRect(context, CGMakeRect(0, 0, rect.size.width, rect.size.height));
请注意,当您创建图像上下文时,您提供了 rect.size
,但没有提供 rect.origin
。因此,上下文无法知道您在 rect.origin
处绘制的内容应该放在上下文的左上角。实现这一目标取决于您。
这是获得相同效果的另一种方法。这更容易一些,因为您只需要针对矩形的原点进行一次调整;然后您可以使用 rect
绘制任意数量的图形,而无需再次调整。
CGContextTranslateCTM(context, -rect.origin.x, -rect.origin.y);
CGContextAddEllipseInRect(context, rect);
还有一件事:您会发现您看到了椭圆的填充,但看不到描边。这是因为 CGContextFillPath
在绘制后清除了上下文的当前路径。一次填充和描边路径:
CGContextDrawPath(context, kCGPathFillStroke);
关于ios - Core Graphics Context 似乎没有返回图像,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21214208/