2010-08-20 99 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。