以上是包含两个UILabel的UITableViewCell。单元格使用[UIColor clearColor]具有透明背景,并且使用UIColor的initWithPatternImage在UITableView上设置背景图案(您可能需要仔细查看)。
我希望能够做的是将文本与背景图案混合,以便文本具有纹理。唯一的问题是我不确定是实现这一目标的最佳方式。
我知道我可以使用NSString代替UILabels并将文本直接绘制到图像中,但是这可以与背景混合,即使它没有在同一个drawRect中绘制(即文本图像将是在UITableViewCell的子类中绘制,其中背景由UITableView实例绘制)?
另一种方法是从文本创建一个图像蒙版,使另一个图像已经纹理化(上半部分为白色,下半部分为深灰色)然后用它来绘制文字,如in this Cocoa with Love tutorial所示。
虽然我显然可以使用该教程来实现第二个实现,但我更倾向于探索第一个,因为它不使用外部图像并且可能更有效。
非常感谢您的想法,链接和代码示例。
请注意:在UILabels上设置低alpha值无法达到预期效果
答案 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);
}