Создание подклассов для ContentView NSDrawer для реализации полностью настраиваемого ящика - PullRequest
2 голосов
/ 02 февраля 2011

Я хочу полностью реализовать свой собственный ящик, создав подкласс NSView и выполняя все мои виды рисования.Я создал собственный класс NSView, который почти ничего не делает, кроме как реализует initWithFrame: и drawRect: который у меня записывается в фрейм / границы NSView (который правильно сообщает).Я также создал этот вид и добавил его к объекту NSDrawer в моем приложении, используя setContentView: так, чтобы он использовал мой пользовательский NSView.

Однако при этом по-прежнему отображается макет выдвижного ящика по умолчанию, прикрепленный к краю моих приложений.NSWindow.Как мне переопределить этот стиль по умолчанию, чтобы я мог нарисовать свой собственный ящик (!) В моем собственном, подклассифицированном NSView без каких-либо настроек по умолчанию, создаваемых ОС?(Так что я могу сам контролировать дизайн и размер ящика, чтобы в основном эмулировать панель вкладок, которая не будет действовать строго как традиционный ящик.)

Ответы [ 2 ]

1 голос
/ 02 февраля 2011

Я сделал собственный ящик, создав подкласс NSWindow, а не NSDrawer. Это было много работы. Существует закрытый объект, NSThemeFrame, который находится между NSWindow и его contentView. Чтобы избежать использования частного API, вы должны сделать прозрачное окно и позволить его contentView действовать как NSThemeFrame. Мэтт Галлахер показывает, как: http://cocoawithlove.com/2008/12/drawing-custom-window-on-mac-os-x.html

1 голос
/ 02 февраля 2011

Этот кадр рисуется видом кадра ящика. Для этого вам нужно использовать некоторые закрытые методы, и, возможно, самый простой способ - использовать пользовательский подкласс NSDrawer. Я не знаю конкретных методов, используемых для ящиков, но вы можете получить заголовок для класса, включая частные методы, используя class-dump .

Редактировать: Это то, что на самом деле делает NSDrawer.

NSDrawer - это непрозрачный объект, который управляет другими объектами. Он создает окно, используя закрытый класс NSDrawerWindow. Настройка его представления содержимого устанавливает представление содержимого окна. Класс NSDrawerWindow использует частный класс NSDrawerFrame, который является подклассом частного класса NSFrameView, в качестве фона и отображает представление содержимого внутри него.

Чтобы изменить фрейм, вам нужен способ изменить вид фрейма в окне. Проще всего было бы получить заголовок для NSDrawerWindow и добавить категорию, которая переопределяет +frameViewClassForStyleMask:, чтобы вернуть класс для вашего пользовательского представления. Ваше пользовательское представление должно быть подклассом NSFrameView, что означает, что вам также нужен заголовок для этого класса.

...