2015-10-19 59 views
0

我在我的智慧結束。我試過我認爲是一切的東西,以擺脫CATextLayer模糊無濟於事。無可否認,有些東西是有幫助的,但是當放大到2倍並且無法接近非CATextLayer文本的清晰度時,文本仍然太模糊。模糊CATextLayer與規模變換

這是我的情況。我有一個可以包含許多子圖層的圖層託管視圖,其中包括CATextLayers(位於自定義的CALayer容器內)。現在,用戶可以縮放主要內容層(其包含所有子層內容),並且通過對內容層應用縮放變換來完成。

這是我目前正在做的事情。大多數有所作爲,但不是很大的區別。如果我一路放大(這是2倍縮放因子),我會得到嚴重模糊的文字。

  • 確保整體座標 - 工程,使有明顯的差異,但在2倍仍然過於模糊規模

  • 關閉陰影上CATextLayer容器層 - 使一個區別不是2x縮放

  • 確保文本圖層的背景顏色完全不透明 - 似乎有所作爲,但不是以2倍的比例

  • 設置contentsScale屬性爲所有層窗口的支持比例因子 - 似乎有所作爲雖然不是在2x縮放這個自定義CATextLayer子順利,抗混疊和子像素的

  • 覆蓋-drawInContext:量化地獄的一切 - 字體呈現更真實得多,但仍處於2x縮放模糊

的代碼片段:

- (void) drawInContext:(CGContextRef)context 
{ 
    // Allow font smoothing. 
    CGContextSetAllowsAntialiasing(context, YES); 
    CGContextSetAllowsFontSmoothing(context, YES); 
    CGContextSetAllowsFontSubpixelPositioning(context, YES); 
    CGContextSetAllowsFontSubpixelQuantization(context, YES); 

    // Set drawing attributes. 
    CGContextSetStrokeColorWithColor(context, self.foregroundColor); 
    CGContextSetFillColorWithColor(context, self.backgroundColor); 
    CGContextFillRect(context, self.bounds); 

    // Font smoothing. 
    CGContextSetShouldAntialias(context, YES); 
    CGContextSetShouldSmoothFonts(context, YES); 
    CGContextSetShouldSubpixelPositionFonts(context, YES); 
    CGContextSetShouldSubpixelQuantizeFonts(context, YES); 

    [super drawInContext:context]; 
} 

我缺少什麼?

回答

0

除了原始問題中提到的所有內容外,對於最可能的文本,影響最大的解決方案是將文本圖層的contentsScale值加倍爲窗口後備比例因子的兩倍 - 如果要支持清晰度在2個縮放的文本。

如果您希望以更高的縮放值支持清晰的文本,請將您的應用程序的最大縮放係數作爲調整後的contentsScale使用。例如,您可以通過重寫-setContentsScale:自定義CATextLayer子做到這一點:

- (void) setContentsScale:(CGFloat)contentsScale 
{ 
    [super setContentsScale:contentsScale * kMaxZoomFactor]; 
} 

注意事項,確保每次瀏覽的支持特性(例如,更改爲具有更高分辨率的屏幕)傳播到你的層託管通過爲您的圖層託管視圖覆蓋-viewDidChangeBackingProperties

- (void) viewDidChangeBackingProperties 
{ 
    // Propagate self.window.backingScaleFactor change to layer hierarchy. 
}