Iphone iOS上的矢量PDF图形元素
目前,在iOS上实现矢量界面元素非常独特,UIImage宣传只支持光栅格式,但我可以将pdf文件设置为IB中UIButton的图像,并以良好的抗锯齿效果进行渲染,但在运行iOS 4.x和3.x的iphone或ipad上都看不到该图像,显示它的唯一方法是在代码中重新创建相同的按钮,并省略.pdf扩展名:Iphone iOS上的矢量PDF图形元素,iphone,cocoa-touch,pdf,ipad,ios,Iphone,Cocoa Touch,Pdf,Ipad,Ios,目前,在iOS上实现矢量界面元素非常独特,UIImage宣传只支持光栅格式,但我可以将pdf文件设置为IB中UIButton的图像,并以良好的抗锯齿效果进行渲染,但在运行iOS 4.x和3.x的iphone或ipad上都看不到该图像,显示它的唯一方法是在代码中重新创建相同的按钮,并省略.pdf扩展名: searchButton = [UIButton buttonWithType:UIButtonTypeCustom]; [searchButton setImage:[UIImage image
searchButton = [UIButton buttonWithType:UIButtonTypeCustom];
[searchButton setImage:[UIImage imageNamed:@"search"] forState:UIControlStateNormal];
[self.view addSubview:searchButton];
但是,这仅显示iOS 4.x上的图像,并且具有相当大的调整大小像素,并且没有抗锯齿,如图所示:
除了显而易见的问题:为什么它看起来如此糟糕,为什么它只在4.x中工作,为什么IB版本根本不工作,还有人知道在应用程序中正确使用矢量艺术的方法吗
它不一定是PDF格式,但我看到苹果在mac端应用程序上使用了很多,上面的代码和IB方法在OSX应用程序上都能完美地工作。顺便说一句,我不知道为什么UIImage不能很好地处理PDF格式,但应该可以编写自己的代码来绘制PDF格式。请参阅《Quartz 2D编程指南》中的“打开和查看PDF”部分。您可以将PDF绘制到CGBitmapContext中,使用它来创建CGImage,然后使用它来创建UIImage。由于iOS错过了PDFKit.framework,我想UIImage的PDF支持有限/中断的问题是,它本来就不应该有任何支持,在这方面,我已经将其有限的支持报告为一个bug(rdar:8338627),它也是IB中的一个bug,渲染支持可能是从osx继承过来的 我已经决定在一个上下文中手动呈现pdf,然后将其保存到UIImage,其代码如下(在iOS 3.x和4.x上测试)
#包括
-(UIImage*)UIImageFromPDF:(NSString*)文件名大小:(CGSize)大小{
CFURLRef pdfURL=cfbundlecopyresourcel(CFBundleGetMainBundle(),(CFStringRef)文件名,NULL,NULL);
if(pdfURL){
CGPDFDocumentRef pdf=CGPDFDocumentCreateWithURL(pdfURL);
CFR释放(pdfURL);
//创建缩放为0.0的上下文,以获取主屏幕的if iOS4+
if(dlsym(RTLD_默认值,“UIGraphicsBeginImageContextWithOptions”)==NULL){
UIGraphicsBeginImageContext(大小);
}否则{
UIGraphicsBeginImageContextWithOptions(大小,编号,0.0);
}
CGContextRef context=UIGraphicsGetCurrentContext();
//翻译内容
CGContextTranslateCm(上下文,0.0,大小。高度);
CGContextScaleCTM(上下文,1.0,-1.0);
CGContextSaveGState(上下文);
//缩放到我们想要的大小
CGPDFPageRef page=CGPDFDocumentGetPage(pdf,1);
CGAffineTransform PDFTTransform=CGPDFPageGetDrawingTransform(第页,kCGPDFCropBox,CGRectMake(0,0,size.width,size.height),0,true);
CGContextConcatCTM(上下文,PDF转换);
CGContextDrawPDFPage(上下文,页面);
CGContextRestoreGState(上下文);
//返回自动删除的UIImage
UIImage*ret=UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsSendImageContext();
CGPDF文件发布(pdf);
返回ret;
}否则{
NSLog(@“无法加载%@”,文件名);
}
返回零;
}
有一个很好的项目可以帮助将PDF渲染成UIImage
#include <dlfcn.h>
-(UIImage *)UIImageFromPDF:(NSString*)fileName size:(CGSize)size{
CFURLRef pdfURL = CFBundleCopyResourceURL(CFBundleGetMainBundle(), (CFStringRef)fileName, NULL, NULL);
if (pdfURL) {
CGPDFDocumentRef pdf = CGPDFDocumentCreateWithURL(pdfURL);
CFRelease(pdfURL);
//create context with scaling 0.0 as to get the main screen's if iOS4+
if (dlsym(RTLD_DEFAULT,"UIGraphicsBeginImageContextWithOptions") == NULL) {
UIGraphicsBeginImageContext(size);
}else {
UIGraphicsBeginImageContextWithOptions(size,NO,0.0);
}
CGContextRef context = UIGraphicsGetCurrentContext();
//translate the content
CGContextTranslateCTM(context, 0.0, size.height);
CGContextScaleCTM(context, 1.0, -1.0);
CGContextSaveGState(context);
//scale to our desired size
CGPDFPageRef page = CGPDFDocumentGetPage(pdf, 1);
CGAffineTransform pdfTransform = CGPDFPageGetDrawingTransform(page, kCGPDFCropBox, CGRectMake(0, 0, size.width, size.height), 0, true);
CGContextConcatCTM(context, pdfTransform);
CGContextDrawPDFPage(context, page);
CGContextRestoreGState(context);
//return autoreleased UIImage
UIImage *ret = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
CGPDFDocumentRelease(pdf);
return ret;
}else {
NSLog(@"Could not load %@",fileName);
}
return nil;
}