添加文字的CALayer:drawInRect不工作

问题描述:

我做了以下内容:添加文字的CALayer:drawInRect不工作

- (void)drawLayer:(CALayer *)layer inContext:(CGContextRef)ctx 
{ 

     UIGraphicsPushContext (ctx); 

     CGRect r = CGRectMake(500, 300, 200, 100); 
     NSString *text = [[NSString alloc] initWithString:@"raaaaaaaa!"]; 
     UIColor *color = [ UIColor colorWithRed: (200.0f) green: (100.0) blue:(200.0f) alpha: 1.0f ]; 
     [color set]; 

     [ text drawInRect: r withFont:[UIFont systemFontOfSize:50] lineBreakMode: UILineBreakModeWordWrap alignment: UITextAlignmentLeft ]; 
     [text release]; 

     UIGraphicsPopContext(); 
    } 
    } 
} 

上面的代码无法正常工作。为什么?

,如果我做的不是跟随,是工作:

- (void)drawLayer:(CALayer *)layer inContext:(CGContextRef)ctx 
{ 
     UIGraphicsPushContext (ctx); 

     CATextLayer *label = [[CATextLayer alloc] init]; 
     [label setFont:@"Didot"]; 
     [label setFontSize:50]; 
     [label setFrame:CGRectMake(400, 300, 400, 100)]; 
     [label setString:@"Helloooooooooooooooooo"]; 
     [label setAlignmentMode:kCAAlignmentCenter]; 
     [label setForegroundColor:[[UIColor blueColor] CGColor]]; 
     [layer addSublayer:label]; 
     [label release]; 

     UIGraphicsPopContext(); 
    } 
} 

的区别是什么,为什么drawInRect什么都不做?

谢谢

编辑 所以,我没有使用正确的UIColor,所以我改变

UIColor *color = [ UIColor colorWithRed: (200.0f) green: (100.0) blue:(200.0f) alpha: 1.0f ]; 

UIColor *color = [UIColor colorWithRed:200/255.0 green:100/255.0 blue: 200/255.0 alpha: 1.0]; 

仍然没有运气,我不能使用drawInRect时看到任何文字

+2

你与白色的白色层上绘制...(1添加此例)。 rgba值从0.0到1.0(不是255) – 2012-08-01 20:00:49

+0

@DavidRönnqvist我以为是的,但没有运气。使用drawIinRect时仍然没有文字:( – peterphonic 2012-08-01 20:38:08

有你两个问题问:

上面的代码无法正常工作。为什么?

起初我以为文字没有出现,因为它是用白色的白色绘制的。虽然它可能仍然如此,但这不是唯一的问题。

您正在将文本绘制到(r)中的矩形与您正在绘制的图层的边界相关。如果要绘制图层的左上角,则矩形的原点应该是(0,0)。上面的代码是仍然不工作。

如果您检查CGSize drawInRect:withFont:... returns(渲染文本的大小),您可以看到渲染文本的大小为0宽。这表示矩形绘制的高度为100是不够的。增加矩形的高度解决了这个问题,现在文本是可见的。如果您在图层中绘制某些文本,可能要绘制的最明智的矩形是图层的边界(CGRect r = [layer bounds];)。

我做了什么,使其工作:

  • 更改文本颜色
  • 改变r原点(0,0)
  • r

增加高度是什么是不同的[...]?

在第一个您绘制文本层的图形上下文(什么drawLayer:inContext的:是应该做的),但在秒例如要添加另一层层的层次结构,而不是绘图在里面。每当您的图层重新绘制时,都会添加一个新的文本图层。所以实际上没有任何东西被绘制到图层上下文中。

接下来发生的事情是,在图层自己绘制之后(空),图层的子图层将自己绘制并将其内容组合在图层上。这就是为什么你会看到文字图层的文字。

如果您添加这样的文本图层,您可以通过不必进行任何手动绘图来提高代码效率。这就要求文本图层在某个早期点(只有一次)被添加到图层中,并且您不需要执行任何自定义绘图(它通常很慢)。

+0

谢谢你的伟大答案和耐心! – peterphonic 2012-08-02 13:11:16

只有当你读过的UIColor的类参考...

UIColor *color = [UIColor colorWithRed:200/255.0 green:100/255.0 blue: 200/255.0 alpha: 1.0]; 

将解决你的问题。

+0

我以为是它,但没有运气。使用drawIinRect时仍然没有文字:( – peterphonic 2012-08-01 20:38:51

我也许你的框架的坐标是错误的。

CGRect r = CGRectMake(500, 300, 200, 100); 
[label setFrame:CGRectMake(400, 300, 400, 100)]; 

注iPhone屏幕尺寸是320×460或3 20 * 568(iPhone5的)。在你的代码中,你设置了超出屏幕的x坐标400和500。

注意你的协调应遵循X < = 320,或者你不能看到它在屏幕上,除非你在一个滚动视图