2012-02-03 68 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