与Quartz 2D混合

时间:2011-06-28 08:07:15

标签: iphone objective-c ios core-graphics quartz-2d

TableViewCell

以上是包含两个UILabel的UITableViewCell。单元格使用[UIColor clearColor]具有透明背景,并且使用UIColor的initWithPatternImage在UITableView上设置背景图案(您可能需要仔细查看)。

我希望能够做的是将文本与背景图案混合,以便文本具有纹理。唯一的问题是我不确定是实现这一目标的最佳方式。

我知道我可以使用NSString代替UILabels并将文本直接绘制到图像中,但是这可以与背景混合,即使它没有在同一个drawRect中绘制(即文本图像将是在UITableViewCell的子类中绘制,其中背景由UITableView实例绘制)?

另一种方法是从文本创建一个图像蒙版,使另一个图像已经纹理化(上半部分为白色,下半部分为深灰色)然后用它来绘制文字,如in this Cocoa with Love tutorial所示。

虽然我显然可以使用该教程来实现第二个实现,但我更倾向于探索第一个,因为它不使用外部图像并且可能更有效。

非常感谢您的想法,链接和代码示例。

请注意:在UILabels上设置低alpha值无法达到预期效果

1 个答案:

答案 0 :(得分:0)

如果将标签设置为非透明且alpha值小于1.0,则应该有效。这些可以在Interface Builder中设置,也可以像这样设置:

[theIncidentLabel setOpaque:NO];
[theIncidentLabel setAlpha:0.5];

您甚至可以将文本颜色设置为alpha值小于1.0的颜色。

[theIncidentLabel setTextColor:[UIColor colorWithRed:1.0 green:1.0 blue:1.0 alpha:0.5]];

使用这些设置,我确实通过我正在处理的项目中的标签看到背景纹理。在我的项目中,列表UITableView也是透明的,背景纹理来自在UITableView后面的UIImageView中加载的图像。

这是简单的alpha混合。我们通过评论中的讨论发现,这不足以满足您的需求。相反,您可以使用alpha掩码,如上所述的教程中所述。

或者,您可以放弃alpha蒙版并将文本绘制到CGImage,然后使用不同的混合模式在背景图案上绘制该图像,可能是kCGBlendModeScreen。这是使用这种技术重写的上述教程中的drawRect方法:

- (void)drawRect:(CGRect)rect
{
    CGContextRef context = UIGraphicsGetCurrentContext();
        // Draw a black background
    [[UIColor blackColor] setFill];
    CGContextFillRect(context, rect);

        // Draw the text upside-down
    CGContextSaveGState(context);
    CGContextTranslateCTM(context, 0, rect.size.height);
    CGContextScaleCTM(context, 1.0, -1.0);
    [[UIColor lightGrayColor] setFill];
    [text drawInRect:rect withFont:[UIFont fontWithName:@"HelveticaNeue-Bold" size:40.0]];
        // Draw it again in a darker color.
    [[UIColor darkGrayColor] setFill];
    CGContextTranslateCTM(context, 0, 50.0);
    [text drawInRect:rect withFont:[UIFont fontWithName:@"HelveticaNeue-Bold" size:40.0]];
    CGContextRestoreGState(context);

        // Create an text image from what we've drawn so far
    CGImageRef textImage = CGBitmapContextCreateImage(context);

        // Draw a white background (overwriting the previous work)
    [[UIColor whiteColor] setFill];
    CGContextFillRect(context, rect);

        // Draw the background image
    CGContextSaveGState(context);
    [[UIImage imageNamed:@"shuttle.jpg"] drawInRect:rect];
        // Set the blend mode. Try different options to meet your tastes.
    CGContextSetBlendMode(context, kCGBlendModeScreen);
        // Draw the text.
    CGContextDrawImage(context, rect, textImage);
        // Clean up.
    CGContextRestoreGState(context);
    CGImageRelease(textImage);
}