2011-10-26 70 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,他們是漸變填充。