重复半透明的NSImage

时间:2011-04-12 16:39:03

标签: objective-c quartz-graphics drawrect

在我正在进行的项目中,我有3个图像:顶部,中部和底部。顶部和底部是固定的高度,中间应该在两者之间重复。 (窗口大小将会改变。)它们都使用用户首选项中的颜色着色,然后需要使用首选项中的值设置其alpha值。

我几乎可以做任何事情。我被困住的部分正在画中间。我决定使用[NSColor +colorWithPaternImage:]是最容易使用的东西。有很多代码可以生成实际的图像和颜色,所以假设它们存在并且不是零。

int problem; // just to help explain things

float alpha;
NSImage *middleTinted;

NSRect drawRect = [self bounds];
drawRect.size.height = self.bounds.size.height - topTinted.size.height - bottomTinted.size.height;
drawRect.origin.y = topTinted.size.height;

NSColor* colorOne = [NSColor colorWithPatternImage:middleTinted];
NSColor* colorTwo = [colorOne colorWithAlphaComponent:alpha];

if(problem == 1)
{
    [colorOne set];
}
else if(problem == 2)
{
    [colorTwo set];
}

[NSBezierPath fillRect:drawRect];

假设problem == 1,它会在正确的位置绘制正确的图像并且尺寸正确,但没有alpha。 (显然,因为我没有指定一个。)

problem == 2时,我希望它能做同样的事情,但具有正确的alpha值。而不是这个,我得到一个黑盒子。

是否有解决方案会使用正确的alpha重复图像?我想我可以在循环中手动绘制图像,但如果存在,我更喜欢更合理的解决方案。

1 个答案:

答案 0 :(得分:1)

我预计问题是图案颜色不支持-colorWithAlphaComponent:

NSCell.h包含一个名为NSDrawThreePartImage的方法,可以完成绘制端盖和平铺图像的工作。它还有一个alphaFraction参数,可以满足您的需求。

如果这对您不起作用,那么您可以通过使用所需的alpha值将middleTinted图像重新渲染为新的NSImage来获得图案颜色方法。 (参见NSImage的绘图......方法。)