2012-02-03 2 views
1

Я создал собственное окно, чтобы переопределить NSWindow. Он отлично работает, за исключением того, что у него есть тень. Я использую [self setHasShadow: NO], чтобы программно установить тень, но она по-прежнему остается. Однако, если я проверяю с помощью [self hasShadow], он возвращает false.Настройка тени окна в какао?

Единственный способ заставить тень уйти, если я отключу тень в Interface Builder. Да, я понимаю, что все в порядке, но мне интересно, почему программные настройки не переопределяют настройку Interface Builder, даже если это делают другие программные настройки.

Мне не разрешено публиковать какие-либо коды, поэтому, пожалуйста, не просите меня об этом.

Нужно ли что-либо делать в дополнение к [self setHasShadow: NO], чтобы программно настроить тень окна?

EDIT: Вызов [self setHasShadow:NO] из awakeFromNib делает тень уходят. Однако я хочу, чтобы удалить тень непосредственно из конструктора не awakeFromNib

Mac OSX Snow Leopard, Xcode 3.2.6

+1

Что происходит, если вы поставите '[само setHasShadow: NO]' в ' awakeFromNib', а не в вашей инициализации? –

+0

@ sudorm-rf Я попытался положить [self setHasShadow: NO] в awakeFromNib, и это заставило тень уйти. Но я предпочел бы, если бы я мог сделать это прямо в конструкторе. Что могло бы изменить настройку между временем вызова конструктора и вызовом awakeFromNib? – fdh

+1

Ну, проблема в том, что IB настраивает ваше окно * после того, как вызывается инициализация. 'awakeFromNib' вызывается после того, как IB инициализирует ваше представление. Таким образом, (большинство) настроек в IB будет иметь приоритет над теми, которые есть в вашем инициализаторе. –

ответ

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: NSTitledWindowMask если не NSBorderlessWindowMask

Но если вы не хотите, чтобы создать окно без границы также он должен работать, когда вы звоните из «awakeFromNib»:

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

Я надеюсь, Вы выбираете для своего оконного класса свой собственный класс? Вы можете сделать это здесь:

enter image description here

Также Вы должны написать это, чтобы отключить тени, если Вы используете без полей окна:

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

У меня есть окно без полей, как вы упомянули, и выбрали мой класс окна. Однако тень исчезает, если я вызываю [self setHasShadow: NO] из awakeFromNib. Почему он не работает, если он вызван только из конструктора? – fdh

+0

Вы также должны написать - (BOOL) hasShadow, посмотрите на мое обновление ответа внизу. –

Смежные вопросы