向CALayer添加文本:drawInRect无法正常工作

时间:2012-08-01 19:58:43

标签: iphone ios ipad calayer

我做了以下事情:

- (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时看不到任何文字

3 个答案:

答案 0 :(得分:7)

您有两个问题:

  

以上代码无效。为什么呢?

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

将文本绘制到(r)中的矩形相对于要绘制的图层的边界。如果要在图层的左上角绘图,则rect的原点应为(0,0)。上面的代码仍然无法正常工作。

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

我做了什么让它发挥作用:

  • 更改了文字颜色
  • r的来源更改为(0,0)
  • r
  • 的高度增加
  

有什么区别[?]?

首先,您将文本绘制到图层的图形上下文中(drawLayer:inContext:应该做什么),但在秒示例中,您要将另一个图层添加到图层的层次结构中,而不是在图层内部绘制。每次重绘图层时,都会添加一个新的文本图层。因此,实际上没有任何内容被绘制到图层图形上下文中。

接下来,在您的图层绘制自己(空)之后,您的图层的子图层会自行绘制,其内容将在图层顶部组成。这就是你看到文本图层文本的原因。

如果您添加这样的文本图层,则无需进行任何手动绘图即可提高代码效率。这要求文本图层在某个早期点(仅一次)添加到您的图层,并且您不进行任何自定义绘图(通常很慢)。

答案 1 :(得分:1)

只有你读过UIColor的类引用...

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

将解决您的问题。

答案 2 :(得分:0)

我或许你的框架的坐标错了。

 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,否则您无法在屏幕上看到它,除非您在滚动视图中添加