【问题标题】:Problems with Background: NSButton on NSView背景问题:NSView 上的 NSButton
【发布时间】:2014-07-14 21:04:58
【问题描述】:

我有一个带有自定义视图的窗口。此视图获取的是在其中绘制为背景的图像。我们现在假设它是一个结构化的灰色背景图像。

- (void)drawRect:(NSRect)dirtyRect
{
    [super drawRect:dirtyRect];
    [self.titlebarBGImage drawInRect:dirtyRect fromRect:NSZeroRect operation:NSCompositeSourceOver fraction:1];
}

在这个自定义视图中,我添加了一个方形纹理按钮,并在 IB 中将其配置为没有边框。然后在我的 AppDelegate 中,我在 applicationDidFinishLaunching 方法中给这个按钮一个图像:

// ...
// [[self.minimizeButton cell] setBackgroundColor:[NSColor clearColor]];
[self.minimizeButton setImage:minimizeImage];
// ...

不知何故,相同的背景 (titlebarBGImage) 也被绘制为按钮背景,因此它具有结构化的灰色图像,但会缩放以适应按钮大小。这看起来很傻,显然不是我想要的。如果我然后用setBackgroundColor: 取消注释行,背景将被清除,但自定义视图背景也不会在按钮图像透明的地方发光(按钮图像是圆形),所以我得到一个矩形,窗口背景发光通过(即示例图像中的绿色),而不是按钮所在视图的背景。

这里有一张图片可以清楚地说明发生了什么:

从上到下:

  • 我想要实现的,即通过按钮透明区域查看灰色结构化背景
  • 我用上面的代码得到了什么,即没有未注释的行:自定义视图背景被压缩到按钮背景中
  • 我使用 clearColor 线得到的结果,即窗口颜色(绿色)会透出,而不是视图的背景。

我怎样才能获得最高的结果?

编辑:我推送了example project to github,以便您明白我的意思。

【问题讨论】:

  • 我改了标题,希望有人能找到这个风滚草。我仍然需要一个答案,谢谢

标签: cocoa drawing nsbutton


【解决方案1】:

解决此问题的一种方法是使用核心动画层。我发现在看this tutorial。为此,您进入 MainMenu.xib 文件,选择 Button 对象并单击 Utilities 中的图层选项卡(参见屏幕截图 (1))。然后为最顶层的 View 激活 Core Animation Layer。所有子元素也都激活了核心动画层(如果项目更大,可能会出现性能问题,所以要小心)。

接下来我将 NSButton 子类化(在我现在更新的 Github 项目中将其称为 BPButtonView)。选择 xib 文件中的 Button 并将 Custom Class 更改为 BPButtonView,或者您所称的任何名称。

新的 NSButton 子类的代码如下所示:

@implementation BPButtonView

- (BOOL)wantsUpdateLayer {
    return YES;
}

- (void)updateLayer {
    if ( [self.cell isHighlighted] ) {
        self.layer.contents = [NSImage imageNamed:@"buttonbg.png"];
    } else {
        self.layer.contents = [NSImage imageNamed:@"buttonbg.png"];
    }
}

@end

我使用updateLayer 方法中的if 语句只是为了表明,根据按钮状态(按下与未按下),您可以提供不同的图片。在视频教程中,还有一个很好的技巧如何实现按钮图片的干净调整大小。

这是生成的应用程序的屏幕截图。中间的红色圆圈是按钮,绿色纹理的东西是视图背景。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-07
    • 2011-11-24
    相关资源
    最近更新 更多