我似乎有一个涉及 renderInContext 的奇怪错误。
我正在开发一个“剪贴簿”应用程序,它允许人们在剪贴簿视图中自由排列文本、彩色方块和照片。请注意,用户可以从内置照片集合(通过 imageNamed: 加载)中添加照片,也可以从他们的资产库中添加照片。
我的代码根据需要从剪贴簿视图及其所有子视图创建 PDF 和缩略图,方法是首先创建 PDFContext(用于 PDF)或 ImageContext(用于缩略图),然后在 scrapBookView.layer 上调用 renderInContext。
一般来说,代码可以工作,我将描述一个例外。当我创建 PDF 时,内置图像和资产库图像都正确包含在呈现的 PDF 中。但是,当我创建缩略图时,会出现内置图像,但资产库图像没有正确显示。我知道 imageView 在那里,因为在其他地方我将其背景颜色设置为浅灰色,但图像本身不存在。
我怀疑可能有一个异步元素将图像加载到图像视图中,并且当它的资产库图像被渲染到 ImageContext 时,图像到达那里的速度不够快。
这可能吗?如果不是,为什么 renderInContext 在 PDFContext 中可以正常工作,但在 ImageContext 中却不那么好?
更重要的是,我怎样才能让我的资产库图像包含在我的缩略图中。
pdf 表示和缩略图都是通过 scrapbookView 中的方法创建的。代码如下:
要创建 pdf:
-(NSData*) pdfRepresentation
{
//== create a pdf context
NSMutableData* result = [[NSMutableData alloc] init];
UIGraphicsBeginPDFContextToData(result, self.bounds, nil);
UIGraphicsBeginPDFPage();
//== draw this view into it
[self.layer renderInContext: UIGraphicsGetCurrentContext()]; // works for asset library images
//== add a rectangular frame also
CGContextRef pdf = UIGraphicsGetCurrentContext();
CGContextAddRect(pdf, self.bounds);
[[UIColor lightGrayColor] setStroke];
CGContextStrokePath(pdf);
//== clean up and return the results
UIGraphicsEndPDFContext();
return [result copy];
}
要创建缩略图:
-(UIImage*) thumbnailRepresentation
{
//== create a large bitmapped image context
CGFloat minSpan = MIN(self.bounds.size.height, self.bounds.size.width);
CGSize imageSize = CGSizeMake(minSpan, minSpan);
UIGraphicsBeginImageContextWithOptions(imageSize, YES, 0.0);
//== draw the current view into the bitmap context
self.backgroundColor = [UIColor whiteColor];
[self.layer renderInContext: UIGraphicsGetCurrentContext()]; // doesn't work for asset library images
self.backgroundColor = [UIColor clearColor];
//== get the preliminary results
UIImage* image = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
//== create a smaller image from this image
CGFloat thumbnailWidth = 40.0;
CGFloat scaleFactor = thumbnailWidth / minSpan;
UIImage* result = [UIImage imageWithCGImage:[image CGImage] scale:scaleFactor orientation:UIImageOrientationUp];
return result;
}
// btw - seems wasteful to create such a large intermediate image
任何帮助,将不胜感激。