[英]Vectorial PDF graphic elements on iOS
目前在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上完美地工作。
由于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;
}
有一个很棒的项目可以帮助将PDF渲染成UIImages。
我不知道为什么UIImage与PDF不兼容,但应该可以编写自己的代码来绘制PDF。 请参阅“Quartz 2D编程指南”中的“打开和查看PDF”部分。 您可以将PDF绘制到CGBitmapContext中,使用它来创建CGImage,并使用它来创建UIImage。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.