ios - Core Graphics Context 似乎没有返回图像

标签 ios objective-c ios7 core-graphics uicollectionviewcell

我正在使用 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/

相关文章:

ios - 抓取 iPhone screenWidth 和 Height 以实现可重用性

iphone - 为什么我的CoreGraphics形状不显示边框?

objective-c - 创建多条画线

objective-c - QTKit 找不到文件或目录

ios - iphone 应用程序崩溃 -[UITableView _selectRowAtIndexPath :animated:scrollPosition:notifyDelegate:]

iphone - iOS崩溃:responsToSelector:消息发送到已释放实例

ios - 我想在不停止另一个应用程序后台播放音乐的情况下制作音效

ios - 苹果 ARKit 示例代码

ios - 无法使用 Github 操作构建 iOS 项目

ios - TypeKit vs NSAttributedString - 在创建样式标签时,我可以使用 TextKit 代替 NSAttributedString 吗?