2016-03-05 6 views
1

Я пытаюсь подражать поведению NSMenu с помощью NSWindow. Однако, когда я попытался привязать окно чуть ниже элемента состояния (в верхней части экрана), я понял, что по умолчанию все окна имеют 1 пиксельный край между верхней частью окна и строкой состояния. Вот что я имею в виду: NSWindow at top of screen with unintended marginРазмещение NSWindow в верхней части экрана без поля 1 пикселя.

Я нашел устаревшую реализацию на GitHub, что удается создать пользовательское окно под строкой состояния без этого края, но я с трудом выяснить, как реализация достигает этого. https://github.com/SquaredTiki/JGMenuWindow

Как я могу избавиться от поля, чтобы окно плохо помещалось в строку состояния?

ответ

2

Нашли решение!

override func constrainFrameRect(frameRect: NSRect, toScreen screen: NSScreen?) -> NSRect { 
    return frameRect 
} 

Переопределить в подклассе NSWindow. Теперь вы можете перенести NSWindow любым способом, который вы пожелаете, и он сможет перейти к строке меню. Это связано с тем, что эта функция обычно вызывается непосредственно перед перемещением окна, чтобы проверить, имеет ли предложенная новая позиция окна верхний край, лежащий на экране. Если это не так, функция вернет отрегулированное положение, в котором верхний край лежит на экране. Переопределяя эту функцию и возвращая frameRect, вы не делаете никаких проверок или перенастроек в новую предложенную позицию окна, вы указываете, что окно может перемещаться в любом месте.

0

похоже, что вы пытаетесь прикрепить свое «меню» к NSStatusItem. Есть ли причина, по которой вы фактически не прикрепляете меню и не устанавливаете соответствующий вид NSMenuItem так, как хотите? У Apple есть пример здесь: https://developer.apple.com/library/mac/documentation/Cocoa/Conceptual/MenuList/Articles/ViewsInMenuItems.html

+0

Да, я не хочу, чтобы поведение NSMenu по умолчанию, например, закрывается, когда вы фокусируетесь на другом окне приложения! – Yves

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