我有一些CATextLayer的問題,這可能是由於我的原因,但我沒有在這個主題上找到任何幫助。我在OS X上(在iOS上它應該是相同的)。CATextLayer獲取柵格化得太早並且模糊
我創建了一個CATextLayer圖層,比例因子> 1,我得到的是一個模糊的文本。我認爲,在應用比例之前,圖層被光柵化了。這是預期的行爲?我希望它不是,因爲它沒有任何意義...... CAShapeLayer在應用了轉換矩陣之後進行了光柵化處理,爲什麼CATextLayer應該有所不同?
萬一我做錯了什麼事情是什麼?
CATextLayer *layer = [CATextLayer layer];
layer.string = @"I like what I am doing";
layer.font = (__bridge CFTypeRef)[NSFont systemFontOfSize:24];
layer.fontSize = 24;
layer.anchorPoint = CGPointZero;
layer.frame = CGRectMake(0, 0, 400, 100);
layer.foregroundColor = [NSColor blackColor].CGColor;
layer.transform = CATransform3DMakeScale(2., 2., 1.);
layer.shouldRasterize = NO;
[self.layer addSublayer:layer];
我現在使用的解決方案是將圖層的contentsScale屬性設置爲比例因子。問題是此解決方案不能縮放:如果任何父層的比例因子發生變化,那麼contentsScale也應該更新。我應該編寫代碼來遍歷圖層樹來更新所有CATextLayers的contentsScale屬性......不完全是我想要做的。
另一個解決方案,這不是一個真正的解決方案,是將文本轉換爲形狀並使用CAShapeLayer。但是,我沒有看到有CATextLayers的意義。
CALayer的自定義子類可以幫助解決這個問題嗎?
編輯:即使CAGradientLayer能夠呈現其內容,如CAShapeLayer,之後,其轉換矩陣應用。有人可以解釋它是如何可能的嗎?
編輯2:我的猜測是路徑和漸變呈現爲OpenGL顯示列表,因此它們通過OpenGL本身在屏幕上的實際大小被柵格化。 Core Animation對文本進行柵格化,因此它們是OpenGL的位圖。
我認爲我現在將用contentScale解決方案。也許,將來我會將文本轉換爲形狀。爲了得到很少的工作最好的結果,這是我現在使用的代碼:
[CATransaction setDisableActions:YES];
CGFloat contentsScale = ceilf(scaleOfParentLayer);
// _scalableTextLayer is a CATextLayer
_scalableTextLayer.contentsScale = contentsScale;
[_scalableTextLayer displayIfNeeded];
[CATransaction setDisableActions:NO];
嗨瑪哈爾,謝謝你的回覆。當父圖層的縮放比例發生變化時,我無法更改字體大小:文本大小將乘以父級的縮放比例因子,而較大的字體大小沒有任何好處。我會得到一個更大,更模糊的文字。 – mbt 2013-05-06 15:04:25
它工作?然後,您可以添加更多詳細信息並將問題標記爲已回答。 – 2013-11-11 17:18:30