NSString drawInRect:并在iOS上删除阴影

时间:2012-04-15 18:28:19

标签: ios opengl-es core-graphics

我正在使用[NSString drawInRect:]向纹理绘制文字,一切正常,直到我添加阴影。它们看起来正确,但经常被我正在绘制的矩形剪掉。

问题在于[NSString sizeWithFont:]不了解投影,因为它们是通过CGContextSetShadowWithColor(...)应用的。

以下是我正在使用的代码(删除了绒毛):

CGSize dim = [theString sizeWithFont:uifont];

...

CGContextSetRGBFillColor(context, 1.0f, 1.0f, 1.0f, 1.0f);
CGContextTranslateCTM(context, 0.0f, dim.height);
CGContextScaleCTM(context, 1.0f, -1.0f);
CGContextSetShadowWithColor(context, CGSizeMake(dropOffset.x, dropOffset.y), dropBlur, dropColorRef);

...

[theString drawInRect:dim withFont:uifont lineBreakMode:UILineBreakModeWordWrap alignment:align];

我已经尝试扩展dim以考虑投影和模糊,这大部分都有效,但有时扩展的rect会因为添加了额外的空间而导致线条完全不同。< / p>

有没有比我正在使用的更好的方法来找到绘制(或绘制字符串)所需的纹理/矩形的大小?

1 个答案:

答案 0 :(得分:2)

您只需要跟踪两个不同的行为。

  1. 包含文本的矩形,您传递给-[NSString drawInRect:]。请拨打此stringBounds
  2. 包含阴影的展开/偏移矩形。请拨打此shadowBounds
  3. 使纹理大小为shadowBounds

    绘制文字时,您需要按shadowBounds.origin - stringBounds.origin翻译。 (或者反过来 - 它取决于你究竟做了什么,按顺序排列。当你得到它时你会知道它。)

    然后执行[theString drawInRect:stringBounds ...]