将文本添加到CALayer:drawInRect无法工作

4
我做了以下操作:
- (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
你正在白色图层上使用白色颜色绘制...(第一个例子)。RGBA值从0.0到1.0(而不是255)。 - David Rönnqvist
@DavidRönnqvist 我以为那就是解决方法了,但还是没有成功。在使用drawIinRect时仍然没有文本显示 :( - peterphonic
3个回答

7
你的问题中有两个方面:

上述代码不起作用,为什么?

一开始我认为文本没有显示是因为它是以白色绘制在白色背景上。虽然可能仍然存在这个问题,但这并不是唯一的问题。
你绘制文本的矩形(r)是相对于你正在绘制的图层的边界的。也就是说,如果你想在图层的左上角绘制,则矩形的原点应该是(0,0)。尽管如此,上述代码仍然不起作用。
如果你检查 drawInRect:withFont:... 返回的 CGSize(渲染文本的大小),你会发现渲染文本的宽度为0。这表明100的高度不足以容纳文本。增加矩形的高度可以解决这个问题,现在文本已经可见了。如果你要在图层内绘制一些文本,也许最合适的矩形是图层的边界(CGRect r = [layer bounds];)。
我所做的让它工作的事情:
  • 更改文本颜色
  • 将r的原点更改为(0,0)
  • 增加了r的高度

两者之间有什么区别?

在第一个示例中,你是将文本绘制到图层的图形上下文中(drawLayer:inContext:应该这样做),但在第二个示例中,你是向图层的层次结构添加了另一个图层,而不是在其中绘制。每当你的图层重绘时,都会向其添加一个新的文本图层。因此,实际上没有任何内容被绘制到图层的图形上下文中。
在你的图层绘制自己(空)之后,接下来发生的是它的子图层绘制自己,并且它们的内容被组合在你的图层上方。这就是为什么你会看到文本图层的文本。
如果你像这样添加文本图层,你可以通过不必进行任何手动绘制来使你的代码更加高效。这要求在某个早期点将文本图层添加到你的图层中(只需一次),并且你不进行任何自定义绘制(通常很慢)。

感谢您的出色回答和耐心等待! - peterphonic

1

只有你读过UIColor类的参考文档...

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

会解决你的问题。


我以为就是这样,但没那么幸运。使用drawIinRect仍然没有文字 :( - peterphonic

0

我觉得可能是你的框架坐标有误。

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

请注意 iPhone 屏幕尺寸为 320*460 或 320*568(iPhone5)。在您的代码中,您将 x 坐标设置为 400 和 500,超出了屏幕范围。 请注意您的坐标应遵循 x <= 320,否则除非将其添加到 scrollview 中,否则无法在屏幕上看到它。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接