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

4

3 回答 3

7

你的问题有两个问题:

上面的代码不起作用。为什么?

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

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

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

我做了什么使它工作:

  • 更改了文本颜色
  • 将原点更改r为 (0,0)
  • 增加高度r

有什么区别 [...] ?

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

接下来会发生什么,在您的图层自己绘制(空)之后,您的图层的子图层会自行绘制,并且它们的内容是在您的图层之上组成的。这就是为什么您会看到文本层的文本。

如果您添加这样的文本层,您可以通过无需进行任何手动绘图来提高代码效率。这需要在较早的时间点(仅一次)将文本图层添加到您的图层,并且您不进行任何自定义绘图(通常很慢)。

于 2012-08-02T07:02:30.297 回答
1

仅当您阅读过 UIColor 的类参考...

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

将解决您的问题。

于 2012-08-01T20:11:53.267 回答
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 否则您无法在屏幕上看到它,除非您将其添加到滚动视图中

于 2013-06-24T19:40:26.847 回答