目前在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,但我已经看到Apple在mac端应用程序上使用了很多,上面的代码和IB方法在OSX应用程序BTW上完美运行。
答案 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。
答案 2 :(得分:0)
我不知道为什么UIImage与PDF不兼容,但应该可以编写自己的代码来绘制PDF。请参阅“Quartz 2D编程指南”中的“打开和查看PDF”部分。您可以将PDF绘制到CGBitmapContext中,使用它来创建CGImage,并使用它来创建UIImage。