2011-04-12 130 views
1

在一个项目中我的工作,我有3张图片:顶部,中部和底部。顶部和底部是固定高度,中间应在两者之间重复。 (窗口的大小会发生变化。)他们都从用户偏好的颜色着色,则需要使用从偏好的价值有自己的Alpha设置。重复半透明NSImage中

我可以做的几乎一切。我被卡住的部分正在画中间。我决定使用[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值。取而代之的是,我得到一个黑匣子。

是否有将重复的图像与正确的阿尔法的解决方案?我想我可以在一个循环中手动绘制图像,但是如果存在的话我更喜欢更合理的解决方案。

回答

1

我想到的问题是,图案颜色不支持-colorWithAlphaComponent:

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

如果这对你不起作用,那么你可能会通过使用所需的alpha值将你的middleTinted图像重新渲染成新的NSImage,从而使图案颜色方法奏效。 (见NSImage中的抽奖......方法。)

+0

第二种解决方案是我开始使用一个,但'NSDrawThreePartImage'伟大的工作,它显然比我更好的解决方案。谢谢! – 2011-04-13 00:14:49