iOS上的矢量PDF图形元素

时间:2010-08-20 17:15:57

标签: iphone cocoa-touch pdf ipad ios

目前在iOS上实现矢量界面元素非常奇特,UIImage宣传仅支持栅格格式,但我能够将pdf文件设置为IB here中的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上的图像,并且具有相当大的像素化大小并且没有抗锯齿,如图所示:

alt text

除了明显的问题,为什么它看起来很糟糕,为什么它只适用于4.x,以及为什么IB版本根本不起作用,有没有人知道在应用程序中正确使用矢量艺术的任何方法?

它不一定是PDF,但我已经看到Apple在mac端应用程序上使用了很多,上面的代码和IB方法在OSX应用程序BTW上完美运行。

3 个答案:

答案 0 :(得分:2)

由于iOS错过了PDFKit.framework,我猜UIImage受限制/破坏PDF支持的问题是它首先不应该有任何支持,在这方面我报告了它有限的支持作为一个bug(rdar:8338627),这也是IB中的一个错误,渲染支持可能是从osx继承的。

我已决定只在上下文中手动渲染pdf,然后将其保存到UIImage,其代码如下(在iOS 3.x和4.x上测试)

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

答案 1 :(得分:1)

这是一个很棒的项目,有助于将PDF渲染成UIImages。

https://github.com/mindbrix/UIImage-PDF

答案 2 :(得分:0)

我不知道为什么UIImage与PDF不兼容,但应该可以编写自己的代码来绘制PDF。请参阅“Quartz 2D编程指南”中的“打开和查看PDF”部分。您可以将PDF绘制到CGBitmapContext中,使用它来创建CGImage,并使用它来创建UIImage。