我遇到了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];
}
你能帮我解决这个问题吗? 我不知道如何解决这个问题。
答案 0 :(得分:1)
我不知道你是否在工具栏按钮中进行任何自定义绘图,但我认为你的问题是你在阴影上调用'set'而不保存和恢复你的图形上下文。
查看NSShadow设置方法的文档。 NSShadow Documentation
“使用接收器的阴影属性,直到另一个阴影为止 设置或直到图形状态恢复。“
您应该首先保存图形上下文,然后调用任何Cocoa的set风格方法,然后恢复上下文。这可以防止将来绘制命令应用你的阴影。
NSGraphicsContext *context = [NSGraphicsContext currentContext];
[context saveGraphicsState];
NSShadow *myCoolShadow = [NSShadow new];
// Shadow code here
[myCoolShadow set];
[context restoreGraphicsState];
答案 1 :(得分:1)
在10.7+上,圆角纹理分段控件和按钮是透明的。在10.5-10.6,它们是渐变填充。