2010-02-05 133 views

回答

37

我不認爲你可以添加一個UIView子類到CALayer對象。但是,如果您想在CALayer對象上繪製文本,可以使用NSString UIKit additions中提供的繪圖函數完成,如下所示。當我的代碼在委託的drawLayer:inContext方法中完成時,可以在子類的drawInContext:方法中使用相同的代碼。是否有任何特定的UILabel功能需要使用?

- (void) drawLayer:(CALayer *)layer inContext:(CGContextRef)ctx { 
    CGContextSetFillColorWithColor(ctx, [[UIColor darkTextColor] CGColor]); 

    UIGraphicsPushContext(ctx); 
    /*[word drawInRect:layer.bounds 
      withFont:[UIFont systemFontOfSize:32] 
    lineBreakMode:UILineBreakModeWordWrap 
     alignment:UITextAlignmentCenter];*/ 

    [word drawAtPoint:CGPointMake(30.0f, 30.0f) 
      forWidth:200.0f 
      withFont:[UIFont boldSystemFontOfSize:32] 
     lineBreakMode:UILineBreakModeClip]; 

    UIGraphicsPopContext(); 
} 
+0

[的UIColor darkTextColor]設置]當圖形上下文已被推 – rpetrich 2010-02-06 10:37:13

+0

也適用@ Deepak Danduprolu這個工作對我來說,但我徘徊爲什麼要調用推送和彈出功能,使其工作 – zeroleaf 2016-01-10 02:45:32

4

你的UILabel已經有一個CALayer的背後。如果您將幾個CALayer放在一起,則可以將UILabel的圖層添加爲其中一個的子圖層(通過使用其layer屬性)。

如果它是直接在您想要的圖層中繪製文本,UIKit NSString增加了Deepak指出的方法。舉個例子,Core Plot framework有一個獨立於Mac/iPhone平臺的CALayer子類,它可以進行文本渲染,CPTextLayer

+0

嘿布拉德,我實際上曾經使用這種技術,(向CALayer添加一個UILabel的圖層),似乎它可能停止工作在iOS 8基礎SDK中?我已經開始重建一個我創建的導出視頻的舊應用程序,並且父CALayer的子層似乎與這個舊代碼保持無效。可能是其他問題,要繼續尋找。 – 2015-05-17 21:44:21

+0

修正了它。對於一直在尋找如何針對iOS 8 Base SDK編譯這項工作的人,請在將標籤圖層添加到另一個CALayer之前調用[label.layer display]。信用:http://stackoverflow.com/questions/23171790/is-it-safe-to-add-a-stolen-uilabels-layer-to-some-other-calayers-sublayer – 2015-05-17 22:17:05

2

添加一個CATextLayer作爲子圖層並設置字符串屬性。這將是最簡單的,您可以輕鬆使用佈局管理器來使其非常通用。

+2

... _可以輕鬆地使用佈局經理_... 那麼,在MacOS,是的,但不是在iOS。 iOS中的CALayers不支持佈局管理器:http://developer.apple.com/library/ios/#documentation/Cocoa/Conceptual/CoreAnimation_guide/Articles/Layout.html – Dalbergia 2011-12-21 20:43:56

+0

不知道!多謝,夥計。 – 2012-01-10 00:06:11

135
 CATextLayer *label = [[CATextLayer alloc] init]; 
     [label setFont:@"Helvetica-Bold"]; 
     [label setFontSize:20]; 
     [label setFrame:validFrame]; 
     [label setString:@"Hello"]; 
     [label setAlignmentMode:kCAAlignmentCenter]; 
     [label setForegroundColor:[[UIColor whiteColor] CGColor]]; 
     [layer addSublayer:label]; 

     [label release]; 
+3

恕我直言,這是一個比自定義CALayer或圖層委託更簡單的解決方案,只要你不需要超過基本的文本繪圖。 CATextLayer已經知道如何繪製文本,所以不需要重新發明輪子。 – Dalbergia 2011-12-21 20:43:10

+0

@ Mshah2爲什麼文本正在提供非抗鋸齒效果?文字看起來像被放大了 – sreekanthk 2014-12-19 07:40:11

+16

您需要調整CALayer的內容比例,否則您會在視網膜(@ 2x)或@ 3x設備上看到模糊的文字。使用:label.contentsScale = [UIScreen mainScreen] .scale; – yonel 2015-01-28 14:30:27

-1

永遠記得刪除先前的子層,如果你要再加一條,以避免重複的觀點:

if let sublayers = layer.sublayers { 
    for sublayer in sublayers { 
     sublayer.removeFromSuperlayer() 
    } 
}