2012-10-12 144 views
2

我目前通過使用CALayerrenderInContext方法從iOS中的UIView創建PDF文檔。iOS從UIViews創建PDF

我面臨的問題是標籤的銳度。我創建了一個UILabel子類覆蓋drawLayer像這樣:

/** Overriding this CALayer delegate method is the magic that allows us to draw a vector version of the label into the layer instead of the default unscalable ugly bitmap */ 
- (void)drawLayer:(CALayer *)layer inContext:(CGContextRef)ctx { 
    BOOL isPDF = !CGRectIsEmpty(UIGraphicsGetPDFContextBounds()); 
    if (!layer.shouldRasterize && isPDF) 
     [self drawRect:self.bounds]; // draw unrasterized 
    else 
     [super drawLayer:layer inContext:ctx]; 
} 

這種方法讓我畫好的清晰的文字,然而,問題是,我不擁有控制權的其他意見。有沒有什麼方法可以讓我爲嵌入UITableViewUIButton的標籤做類似的事情。我想我正在尋找一種方法來遍歷視圖堆棧,並做一些讓我繪製更清晰的文本。

下面是一個例子: 本文呈現很好(我的自定義的UILabel子類) Imgur

在標準文本分段控制不是尖銳:

Imgur

編輯:我得到的上下文畫成我的PDF如下:

UIGraphicsBeginPDFContextToData(self.pdfData, CGRectZero, nil); 
pdfContext = UIGraphicsGetCurrentContext(); 
UIGraphicsBeginPDFPageWithInfo(CGRectMake(0, 0, 612, 792), nil); 
[view.layer renderInContext:pdfContext]; 
+0

你是如何獲得你的語境」用'renderInContext'重新繪製?我想知道你是否可以在那裏翻倍。 – matt

+0

更新了我的文章。 – danielbeard

回答

2

我最終遍歷了視圖層次結構,並將每個UILabel設置爲覆蓋drawLayer的我的自定義子類。

這裏是我穿過的看法:

我該如何改變類:

+(void) setClassForLabel: (UIView*) label { 
    static Class myFancyObjectClass; 
    myFancyObjectClass = objc_getClass("UIPDFLabel"); 
    object_setClass(label, myFancyObjectClass); 
} 

比較:

老:

Image

新:

Imgur

不知道是否有更好的方式來做到這一點,但它似乎爲我的目的工作。

編輯:找到一個更通用的方法來做到這一點,不涉及改變類或遍歷整個視圖層次結構。我正在使用方法swizzling。如果需要,此方法還可讓您執行諸如圍繞具有邊框的每個視圖等酷炫事物。首先,我創建了一個類別UIView+PDF與我的drawLayer方法的定製實現,那麼在load方法我用的是以下幾點:

// The "+ load" method is called once, very early in the application life-cycle. 
// It's called even before the "main" function is called. Beware: there's no 
// autorelease pool at this point, so avoid Objective-C calls. 
Method original, swizzle; 

// Get the "- (void) drawLayer:inContext:" method. 
original = class_getInstanceMethod(self, @selector(drawLayer:inContext:)); 
// Get the "- (void)swizzled_drawLayer:inContext:" method. 
swizzle = class_getInstanceMethod(self, @selector(swizzled_drawLayer:inContext:)); 
// Swap their implementations. 
method_exchangeImplementations(original, swizzle); 

從這裏的代碼工作:http://darkdust.net/writings/objective-c/method-swizzling

+0

WTF @ setClassForLabel -_-,發揮良好。 – 0xSina

+0

我怎樣才能使這個兩次?輝煌。 – matt

+1

你願意分享一下'drawLayer'的自定義實現嗎? –