繁体   English   中英

iOS上的矢量PDF图形元素

[英]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。

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM