仅在我的文本所在的UILabel矩形中绘制背景颜色

时间:2010-07-07 20:04:57

标签: iphone cocoa-touch text uikit uilabel

我需要创建一个自定义UILabel来显示一些动态多行文字。文本颜色在黑色背景上是白色的。但是背景应该只在文本后面可见,以模拟所选文本区域的效果。

我开始使用子类化UILabel并重写drawTextInRect来创建自己的绘图。

- (void) drawTextInRect:(CGRect)rect
{
 /* do some custom drawings here */

 [super drawTextInRect:rect];
}

到目前为止,我无法想出一种计算文本边界的方法。 现在有人怎么做这种东西?非常感谢。

2 个答案:

答案 0 :(得分:0)

NSString在UIKit中有一些附加功能,允许在给定各种参数的情况下计算用于呈现字符串的大小。您可以使用这些方法计算UILabel渲染字符串所需的大小,然后将UILabel的大小精确调整为此大小。在文档中查找名为-sizeWithFont:的方法,其中列出了所有其他变体。确保使用正确的方法来匹配UILabel的配置方式。

这里有一个警告,就是在iOS 4上,有一个错误,这些方法实际上返回的颜色与实际用于绘图的方式略有不同(至少对于iPhone 4上的系统字体[例如Helvetica Neue] ,我不知道这个bug是否影响任何其他字体)。不幸的是,我所知道的唯一解决方法是切换到所有文本呈现的Core Text,因此您可能更喜欢忍受这个错误(如果它甚至影响到您),直到Apple推出软件更新。这个bug确实会影响Apple自己的应用程序,所以有很多先例不处理它。

答案 1 :(得分:0)

确定。现在,在stackoverflow的一些输入后,我使用这段代码片段来获取文本块,但它只适用于单行文本。

- (void) drawTextInRect:(CGRect)rect
{
    CGFloat lineHeight  = [self.text sizeWithFont:self.font].height;
    CGSize  testSize    = CGSizeMake(320, lineHeight * self.numberOfLines);
    CGSize  textSize    = [self.text sizeWithFont:self.font constrainedToSize:testSize lineBreakMode:self.lineBreakMode];

    //NSLog(@"drawTextInRect lineHeight %f, width %f x height %f", lineHeight, textSize.width, textSize.height);

    CGContextRef context = UIGraphicsGetCurrentContext();
    CGContextSaveGState(context);

    CGContextSetRGBFillColor(context, 0.0, 0.0, 0.0, 1.0);
    CGContextAddRect(context, CGRectMake(0, 0, textSize.width, textSize.height));
    CGContextFillPath(context);

    CGContextRestoreGState(context);

    [super drawTextInRect:rect];
}

如果我有多行文字,我仍然需要一些代码来计算文本的路径信息而不仅仅是边界矩形,以便我可以使用CGContextDrawPath来绘制我的背景。有什么想法吗?感谢。