Iphone iOS上的矢量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

目前,在iOS上实现矢量界面元素非常独特,UIImage宣传只支持光栅格式,但我可以将pdf文件设置为IB中UIButton的图像,并以良好的抗锯齿效果进行渲染,但在运行iOS 4.x和3.x的iphone或ipad上都看不到该图像,显示它的唯一方法是在代码中重新创建相同的按钮,并省略.pdf扩展名:

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; 
}