gpt4 book ai didi

iphone - 与 Quartz 2D 混合

转载 作者:行者123 更新时间:2023-12-01 17:01:31 25 4
gpt4 key购买 nike

TableViewCell

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

我想做的是将文本与背景图案混合在一起,以便文本具有通过的纹理。唯一的事情是我不确定是实现这一目标的最佳方式。

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

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

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

您的想法、链接和代码示例将不胜感激。

请注意:在 UILabel 上设置较低的 alpha 值不会达到预期的效果

最佳答案

如果您将标签设置为不透明且 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 mask 。

或者,您可以放弃 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);
}

关于iphone - 与 Quartz 2D 混合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6503435/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com