2011-10-26 34 views
0

我遇到了NSSegmentedControl的问题。 我有一个自定义的视图,我绘制了带阴影的渐变。 绘图是可以的,但是当我将一个NSSegmentedControl放入其中时,会发生一些奇怪的事情 - 自定义视图的背景通过分段控件发光,就好像分段控件具有低alpha值一样。当绘制超级视图时NSSegmentedControl的奇怪绘图行为

这里有图片,演示问题:

随着背景自定义视图: enter image description here

而背景自定义视图: enter image description here

正如你可以看到左边第一张图片中的上角,分段控件未正确绘制。 下面是从自定义视图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]; 

}  

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

+0

全部| Gro ... | Fav ...控制?我无法理解问题是什么。 – paulmelnikow

+0

对不起。我有点不爽。我的意思是前后分段控制 - 在第一张图片中不应该有这个丑陋的渐变。 –

+0

所以你问 - 为什么你应用到工具栏的渐变流入后退和+按钮? – paulmelnikow

回答

1

我不知道你是否在工具栏按钮中进行任何自定义绘图,但我认为你的问题是你在影子上调用'set'而不保存和恢复你的图形上下文。

查看NSShadow设置方法的文档。 NSShadow Documentation

“接收器的阴影属性被使用,直到另阴影是 集或直到图形状态被恢复”。

你应该总是先保存你的图形上下文,然后调用Cocoa的任何set-style方法,然后恢复上下文。这使得未来的绘制命令不会影响你的阴影。

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

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

[context restoreGraphicsState]; 
1

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