2012-02-03 69 views
1

我已經創建了一個自定義窗口來覆蓋NSWindow。除了它有一個影子的事實之外,它完美地工作。我使用[self setHasShadow:NO]以編程方式設置陰影,但它仍然存在。但是,如果我使用[self hasShadow]進行檢查,它將返回false。在可可中設置窗口的陰影?

我似乎讓陰影消失的唯一方法是如果在Interface Builder中關閉陰影。是的,我意識到這是好的,但我很好奇爲什麼編程設置不會覆蓋Interface Builder設置,即使其他編程設置也可以。

我不允許發佈任何代碼,因此請不要要求我這樣做。

除了[self setHasShadow:NO]之外,我還需要做些什麼來以編程方式設置窗口的陰影嗎?

編輯:調用從awakeFromNib[self setHasShadow:NO]使陰影消失。不過,我想直接從構造不awakeFromNib

的Mac OSX雪豹時,Xcode 3.2.6

+1

如果你把'[自setHasShadow:NO]會發生什麼:'在'

enter image description here

此外,如果你使用無邊框窗口你應該寫這個禁用陰影awakeFromNib',而不是在你的初始化? – 2012-02-03 06:10:07

+0

@ sudorm-rf我試圖在awakeFromNib中放置[self setHasShadow:NO],這會讓陰影消失。但我寧願如果我可以直接在構造函數中做到這一點。在調用構造函數和awakeFromNib被調用之間可能會改變設置? – fdh 2012-02-03 20:27:00

+1

嗯,問題是IB在你調用初始化後配置你的窗口*。在IB初始化您的視圖後調用awakeFromNib。因此,IB中的(大多數)設置將優先於初始化程序中的設置。 – 2012-02-03 20:28:34

回答

2

這可如果你把它稱爲「awakeFromNib」或進行無邊距窗口,像這樣做去除陰影:

- (id)initWithContentRect:(NSRect)contentRect 
     styleMask:(NSUInteger)windowStyle 
      backing:(NSBackingStoreType)bufferingType 
      defer:(BOOL)flag 
{ 

self = [super initWithContentRect: contentRect 
       styleMask: NSBorderlessWindowMask 
       backing: NSBackingStoreBuffered 
        defer: NO]; 

if(self) 
{ 
    [self setHasShadow:NO]; 

    [self setBackgroundColor:[NSColor clearColor]]; 
    [self setOpaque:NO]; 
} 

return self; 
} 

**我不知道你是否有標題欄。如果您有您應該使用styleMask:

-(void)awakeFromNib { 
    [self setHasShadow:NO]; 
} 

我希望:如果不NSTitledWindowMask NSBorderlessWindowMask

,但如果你不想創建無邊框窗口此外,當您從「awakeFromNib」稱呼它應該工作你選擇你的窗口課你自己的寫作課?你可以在這裏做到這一點:

-(BOOL)hasShadow { 
    return NO; 
} 
+0

我提到了一個無邊界窗口,並選擇了我的窗口類。但是,如果我從awakeFromNib調用[self setHasShadow:NO],陰影就會消失。如果僅從構造函數中調用它,它爲什麼不起作用? – fdh 2012-02-03 20:29:39

+0

你也應該寫 - (布爾)hasShadow,看我的答案更新在底部。 – 2012-02-03 22:38:17