2010-08-20 3 views
4

현재 iOS에서 벡터 인터페이스 요소를 구현하는 것은 매우 독특합니다. UIImage는 래스터 형식 만 지원하지만 IB here에서는 UIButton 이미지로 PDF 파일을 설정할 수 있습니다. 안티 앨리어싱을 사용하면 이미지가 iOS 4.x 및 3.x를 실행하는 iphone 또는 ipad에 표시되지 않지만 표시 할 수있는 유일한 방법은 코드에서 동일한 버튼을 다시 만들고 .pdf 확장자를 두지 않는 것입니다.iOS의 벡터 그래픽 PDF 요소

그러나 이것은 그림과 같이 iOS 4.x의 이미지와 상당한 픽셀 크기 조정 및 안티 앨리어싱 만 표시합니다.

alt text

왜 이렇게 나쁘게 보이는지, 왜 4.x에서만 작동하는지, 그리고 IB 버전이 전혀 작동하지 않는 이유에 대한 명백한 질문 외에 앱에서 사용자 그래픽 아트를 알기위한 방법을 아는 사람이 있습니까?

반드시 PDF 일 필요는 없지만 위의 코드와 IB 접근법 모두가 Mac OSX 앱에서 완벽하게 작동합니다.

답변

2

iOS는 PDFKit.framework를 그리워합니다. UIImage의 제한된/깨진 PDF 지원 문제는 처음부터 아무런 지원도하지 않는다는 것입니다. 그 점에 관해서는 제한적인 지원을보고했습니다. 버그로 (rdar : 8338627) 그것은 IB에서 너무 버그를 렌더링 지원 아마도 osx에서 실시하고있다.

난 그냥 아래 인 코드하는 위해있는 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 Programming Guide의 "PDF 열기 및보기"섹션을 참조하십시오. PDF를 CGBitmapContext로 그려서 CGImage를 생성하고 그것을 사용하여 UIImage를 생성 할 수 있습니다.

1

있다 (아이폰 OS 3.x 및 4.x의 테스트) 것을 저장 한 다음 상황에서 수동으로 PDF 렌더링에 정착 PDF를 UIImages로 렌더링하는 데 도움이되는 훌륭한 프로젝트입니다.

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

관련 문제