Векторные графические элементы PDF на iOS - PullRequest
4 голосов
/ 20 августа 2010

В настоящее время реализация векторных элементов интерфейса на iOS очень своеобразна, UIImage объявляет о поддержке только растровых форматов, но я могу установить PDF-файл как изображение UIButton в IB here, и он рендерится с хорошим сглаживанием, однакоизображение не видно ни на iphone, ни на ipad под управлением iOS 4.x и 3.x, единственный способ показать его - воссоздать ту же кнопку в коде и пропустить расширение .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, но я видел, как Apple часто использует приложения на стороне Mac, и код, и подходы IB, описанные выше, прекрасно работают в приложениях для OSX.

Ответы [ 3 ]

2 голосов
/ 21 августа 2010

Поскольку iOS пропускает PDFKit.framework, я предполагаю, что проблема с ограниченной / неработающей поддержкой PDF UIImage заключается в том, что она вообще не должна иметь никакой поддержки, в этом отношении я сообщил об ограниченной поддержке, которую она имееткак ошибка (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 голос
/ 16 июля 2012

Есть отличный проект, который помогает с рендерингом PDF в UIImages.

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

0 голосов
/ 21 августа 2010

Я не знаю, почему UIImage плохо работает с PDF, но должна быть возможность написать собственный код для рисования PDF. См. Раздел «Открытие и просмотр PDF» в Руководстве по программированию в Quartz 2D. Вы можете нарисовать PDF-файл в CGBitmapContext, использовать его для создания CGImage и использовать его для создания UIImage.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...