0

我遇到了 NSSegmentedControl 的问题。我有一个自定义视图,在其中绘制带有阴影的渐变。绘图没问题,但是当我在其中放置一个 NSSegmentedControl 时,会发生一些奇怪的事情 - 自定义视图的背景通过分段控件闪耀,好像分段控件具有低 alpha 值。

以下是展示问题的图片:

在后台使用自定义视图: 在此处输入图像描述

在后台没有自定义视图: 在此处输入图像描述

正如您在第一张图像的左上角看到的那样,分段控件未正确绘制。这是自定义视图中的 drawRect 方法:

- (void)drawRect:(NSRect)dirtyRect {

    NSShadow *shadow = [[NSShadow alloc] init];

    [shadow setShadowOffset:NSMakeSize(0.0, -6.0)];

    [shadow setShadowBlurRadius:3.0];

    [shadow setShadowColor:[[NSColor blackColor] colorWithAlphaComponent:0.3]];

    [shadow set];



    NSGradient *gradient = [[NSGradient alloc] initWithColorsAndLocations:[NSColor colorWithDeviceWhite:0.8 alpha:1.0],(CGFloat)0.0,[NSColor colorWithDeviceWhite:0.65 alpha:1.0],(CGFloat)0.5,[NSColor colorWithDeviceWhite:0.3 alpha:1.0],(CGFloat)0.5,[NSColor colorWithDeviceWhite:0.5 alpha:1.0],(CGFloat)1.0, nil];

    [gradient drawInRect:self.bounds angle:90];



    NSBezierPath *bezierPath = [NSBezierPath bezierPath];

    [bezierPath moveToPoint:NSMakePoint(0, 0)];

    [bezierPath lineToPoint:NSMakePoint(-self.bounds.size.height, 0)];

    [bezierPath lineToPoint:NSMakePoint(-self.bounds.size.height, -self.bounds.size.width)];

    [bezierPath lineToPoint:NSMakePoint(0, -self.bounds.size.width)];



    [[NSColor whiteColor] set];



    [bezierPath stroke];

}    

你能帮我解决这个问题吗?我不知道如何解决这个问题。

4

2 回答 2

1

在 10.7+ 上,圆形纹理分段控件和按钮是透明的。在 10.5-10.6 上,它们是渐变填充的。

于 2012-12-21T05:05:19.377 回答
1

我不知道您是否在工具栏按钮中进行任何自定义绘图,但我认为您的问题是您在没有保存和恢复图形上下文的情况下在阴影上调用“设置”。

查看 NSShadow 的 set 方法的文档。 NSShadow 文档

“在设置另一个阴影或恢复图形状态之前,将使用接收器的阴影属性。”

你应该总是先保存你的图形上下文,然后调用任何 Cocoa 的 set-style 方法,然后恢复上下文。这可以防止将来的绘制命令应用您的阴影。

NSGraphicsContext *context = [NSGraphicsContext currentContext];
[context saveGraphicsState];

NSShadow *myCoolShadow = [NSShadow new];
// Shadow code here
[myCoolShadow set];

[context restoreGraphicsState];
于 2012-06-26T06:25:09.640 回答