【问题标题】:Repeat a semi-transparent NSImage重复一个半透明的 NSImage
【发布时间】:2011-04-12 16:39:02
【问题描述】:

在我正在进行的一个项目中,我有 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 重复图像?我想我可以在循环中手动绘制图像,但如果存在,我更喜欢更合理的解决方案。

【问题讨论】:

    标签: objective-c quartz-graphics drawrect


    【解决方案1】:

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

    NSCell.h 包含一个名为NSDrawThreePartImage 的方法,它负责绘制端盖和中间的平铺图像。它还有一个 alphaFraction 参数,应该可以满足您的需求。

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

    【讨论】:

    • 第二个解决方案是我开始使用的那个,但是NSDrawThreePartImage 效果很好,显然它比我的解决方案更好。谢谢!
    猜你喜欢
    • 2011-02-21
    • 2012-04-15
    • 2012-07-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-29
    • 1970-01-01
    相关资源
    最近更新 更多