2010-08-20 107 views
4

目前在iOS上实现矢量界面元素是非常特殊的,UIImage宣布仅支持光栅格式,但是我能够将IBU文件设置为IB here中的UIButton图像,并且它呈现良好抗锯齿,但是图像在运行iOS 4.x和3.x的iphone或ipad上都不可见,唯一能让它显示的方法是在代码中重新创建相同的按钮并省略.pdf扩展名:iOS上的矢量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,但我看到苹果公司在Mac端应用程序中使用了很多,上面的代码和IB方法都在OSX应用程序上完美地工作。

回答

2

由于iOS未命中PDFKit.framework,我认为UIImage受限的/破坏的PDF支持问题在于它不应该首先得到任何支持,在这方面,我报告了对它的有限支持有一个bug(rdar:8338627),这也是IB的一个bug,因为渲染支持很可能由osx继承。

我已经解决,只是手动渲染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; 
} 
0

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