NSPanel с «заголовком», не отмеченным в Интерфейсном Разработчике, не появляется - PullRequest
7 голосов
/ 05 октября 2011

Итак, я думал, что покрыл свои базы, но, по-видимому, мне не хватает одного или двух ключевых шагов.

У меня есть NSPanel, который отображается (makeKeyAndOrderFront:) при нажатии NSStatusItem.Все отлично работает, но поскольку NSPanel отображает строку заголовка, панель также перетаскивается.(Это нежелательно.)

На первом снимке экрана показана панель с включенной «Строкой заголовка» в Интерфейсном Разработчике в категории «Внешний вид».(Извините за размытие, пока что все еще под замком.)

First screenshot

Изменение only , выполненное в Интерфейсном Разработчике, снимает флажокФлажок «Панель заголовка».Затем я сохраняю и перезапускаю, и это то, что вы видите на втором скриншоте.Пока появляется небольшая тень, панель не появляется.

enter image description here

Что я пробовал:

  • Я переклассифицировал NSPanel и возвратил YES для canBecomeKeyWindow и canBecomeMainWindow после небольшого исследования, но (до подклассов) оба метода вернули NO независимо от того, использовал ли я строку заголовка или нет.Поэтому я не думаю, что это проблема.

  • Я убедился, что фрейм для NSPanel установлен правильно.Он имеет хорошую высоту, и источник также установлен правильно.

Редактировать: Забыли упомянуть:

Приложение представляет собой менюприложение только для бара.На приведенном ниже снимке экрана обратите внимание, что в Info.plist была добавлена ​​дополнительная запись для обеспечения этого.

Info Plist

Ответы [ 2 ]

4 голосов
/ 08 октября 2011

У меня были проблемы с этим в прошлом.Я смог решить эту проблему, сначала «игнорируя» другие приложения, а затем сделав его ключевым окном.Сделайте попытку и посмотрите, работает ли он для вас.

[NSApp activateIgnoringOtherApps:YES];
[[self window]makeKeyAndOrderFront:self];

Также попробуйте установить уровень окна на NSPopUpMenuWindowLevel во время инициализации.

[[self window]setLevel:NSPopUpMenuWindowLevel];

У меня также были проблемы с тем, как файлы пера загружаются в Mac OS X. Они загружаются «лениво», что означает, что они не будут инициализированы до тех пор, поканужноЭто вызывает проблему, когда вы хотите установить специфику в окне, но не можете, потому что awakeFromNib не вызывается из-за отложенной загрузки пера.Чтобы это исправить, вот что я делал в прошлом.В своем делегате (или везде, где вы инициализируете свое окно), запустите окно в действие, открыв свойство window в инициализированном классе:

wc = [[blah alloc]initWithWindowNibName:NSStringFromClass([blah class])];
(void)[wc window]; //just kicks the lazy nib loading into gear

Тем самым вы заставляете перо инициализировать,Таким образом, когда пользователь щелкает значок меню, перо уже инициализировано, и awakeFromNib уже вызван.

1 голос
/ 08 октября 2011

Пока появляется небольшая тень, панель не появляется.

Вы говорите makeKeyAndOrderFront: на этом объекте NSPanel не отображается при запуске приложения?Я только что создал пример проекта, NSButton запускает тот же тип NSPanel для отображения, и он работает нормально .. titleBar включен или нет.

http://cl.ly/3d0U3C0P3u2D0m3T1w1N

...