1

我似乎有一个涉及 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

任何帮助,将不胜感激。

4

0 回答 0